@gjsify/adwaita-web 0.54.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 (439) hide show
  1. package/dist/adwaita-web.css +8066 -3033
  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 +1 -1
  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/style-classes.spec.ts +9 -8
  436. package/src/styles.generated.ts +1 -1
  437. package/src/tab-chip.ts +200 -0
  438. package/src/template-classes.ts +45 -0
  439. package/src/test.browser.mts +152 -0
@@ -0,0 +1,443 @@
1
+ // DOM-level tests for <adw-tab-overview>: the thumbnail grid that covers a tab view.
2
+ //
3
+ // The search rows are driven by the SAME table the core suite asserts against
4
+ // (`TAB_SEARCH_VECTORS`), because the predicate is `AdwTabGrid`'s three
5
+ // `GtkStringFilter`s and a browser-only copy of it is exactly the drift the table
6
+ // exists to stop. The rest are the C rules that are easy to get wrong: the PLURAL
7
+ // title, `update_header_bar`'s four-way OR, `empty_changed_cb`'s two empty states,
8
+ // the search entry going to the PINNED grid first, and the close-on-activate rule.
9
+ import { describe, expect, it } from '@gjsify/unit';
10
+
11
+ import {
12
+ GRID_NAVIGATION_GEOMETRY,
13
+ GRID_NAVIGATION_VECTORS,
14
+ TAB_SEARCH_VECTORS,
15
+ } from '@gjsify/adwaita-core/conformance';
16
+ import { tabSearchMatches } from '@gjsify/adwaita-core';
17
+
18
+ import type { AdwTabOverview } from './elements/adw-tab-overview.js';
19
+ import type { AdwTabView } from './elements/adw-tab-view.js';
20
+
21
+ let serial = 0;
22
+
23
+ function mount(options: { pages?: number; pinned?: boolean; attrs?: string } = {}): {
24
+ overview: AdwTabOverview;
25
+ view: AdwTabView;
26
+ host: HTMLElement;
27
+ } {
28
+ const count = options.pages ?? 3;
29
+ const rows = Array.from({ length: count }, (_, i) => {
30
+ const pinned = options.pinned !== undefined && i < (options.pinned ? 1 : 0);
31
+ return `<adw-tab-page title="Page ${i}"${pinned ? ' pinned' : ''}></adw-tab-page>`;
32
+ }).join('');
33
+ const host = document.createElement('div');
34
+ host.innerHTML = `<adw-tab-overview ${options.attrs ?? ''}><adw-tab-view>${rows}</adw-tab-view></adw-tab-overview>`;
35
+ // A box, because `.focus()` on a zero-height element is a no-op in Firefox and the
36
+ // keyboard rules below are exactly what is under test.
37
+ (host.querySelector('adw-tab-overview') as HTMLElement).style.cssText = 'width: 400px; height: 300px;';
38
+ document.body.appendChild(host);
39
+ return {
40
+ overview: host.querySelector('adw-tab-overview') as AdwTabOverview,
41
+ view: host.querySelector('adw-tab-view') as AdwTabView,
42
+ host,
43
+ };
44
+ }
45
+
46
+ const grid = (overview: AdwTabOverview, pinned = false): HTMLElement =>
47
+ overview.querySelector(pinned ? '.adw-tab-grid.pinned-grid' : '.adw-tab-grid:not(.pinned-grid)') as HTMLElement;
48
+
49
+ const thumbs = (overview: AdwTabOverview, pinned = false): HTMLElement[] =>
50
+ Array.from(grid(overview, pinned).querySelectorAll('.adw-tab-thumbnail'));
51
+
52
+ const searchEntry = (overview: AdwTabOverview): HTMLInputElement =>
53
+ overview.querySelector('.overview-search-entry') as HTMLInputElement;
54
+
55
+ export const AdwTabOverviewTest = async () => {
56
+ await describe('<adw-tab-overview> thumbnail grids', async () => {
57
+ await it('finds the tab view among its own children and shows one thumbnail per page', async () => {
58
+ const { overview, view, host } = mount({ pages: 3 });
59
+ expect(overview.view).toBe(view);
60
+ expect(thumbs(overview)).toHaveLength(3);
61
+ expect((thumbs(overview)[1].querySelector('.tab-label') as HTMLElement).textContent).toBe('Page 1');
62
+ host.remove();
63
+ });
64
+
65
+ await it('splits PINNED pages into the pinned grid, in view order', async () => {
66
+ const { overview, host } = mount({ pages: 3, pinned: true });
67
+ expect(thumbs(overview, true)).toHaveLength(1);
68
+ expect(thumbs(overview)).toHaveLength(2);
69
+ host.remove();
70
+ });
71
+
72
+ await it('follows pages attached, detached and repinned', async () => {
73
+ const { overview, view, host } = mount({ pages: 2 });
74
+ view.appendPage({ id: 'late', title: 'Late' });
75
+ expect(thumbs(overview)).toHaveLength(3);
76
+ view.setPagePinned('late', true);
77
+ expect(thumbs(overview, true)).toHaveLength(1);
78
+ expect(thumbs(overview)).toHaveLength(2);
79
+ // `close_page_cb` DENIES a pinned page, which is why its thumbnail carries the
80
+ // unpin mark instead of a close button. Nothing leaves until it is unpinned.
81
+ view.closePage('late');
82
+ expect(view.nPages).toBe(3);
83
+ view.setPagePinned('late', false);
84
+ view.closePage('late');
85
+ expect(thumbs(overview, true)).toHaveLength(0);
86
+ expect(thumbs(overview)).toHaveLength(2);
87
+ host.remove();
88
+ });
89
+
90
+ await it('selects the page and closes the overview when a thumbnail is activated', async () => {
91
+ const { overview, view, host } = mount({ pages: 3 });
92
+ overview.setOpen(true);
93
+ thumbs(overview)[2].click();
94
+ expect(view.selectedId).toBe('tab-3');
95
+ expect(overview.open).toBe(false);
96
+ host.remove();
97
+ });
98
+
99
+ await it('closes the page from the thumbnail close button, without activating it', async () => {
100
+ const { overview, view, host } = mount({ pages: 3 });
101
+ overview.setOpen(true);
102
+ const closeBtn = thumbs(overview)[0].querySelector('.tab-close-button') as HTMLButtonElement;
103
+ expect(closeBtn.hidden).toBe(false);
104
+ closeBtn.click();
105
+ expect(view.nPages).toBe(2);
106
+ // The button swallowed the click: the overview did NOT close, which is the
107
+ // difference from activating the thumbnail itself. The selection moving to
108
+ // `tab-2` is `Adw.TabView`'s own close-successor rule, not the button.
109
+ expect(overview.open).toBe(true);
110
+ expect(view.selectedId).toBe('tab-2');
111
+ host.remove();
112
+ });
113
+
114
+ await it('shows the unpin affordance on a pinned thumbnail instead of the close button', async () => {
115
+ const { overview, host } = mount({ pages: 1, pinned: true });
116
+ const thumb = thumbs(overview, true)[0];
117
+ expect((thumb.querySelector('.tab-close-button') as HTMLElement).hidden).toBe(true);
118
+ const unpin = thumb.querySelector('.tab-unpin-icon') as HTMLElement;
119
+ expect(unpin.hidden).toBe(false);
120
+ unpin.click();
121
+ expect(thumbs(overview, true)).toHaveLength(0);
122
+ expect(thumbs(overview)).toHaveLength(1);
123
+ host.remove();
124
+ });
125
+
126
+ await it('swaps the thumbnail icon for a spinner while the page is loading', async () => {
127
+ const { overview, view, host } = mount({ pages: 1 });
128
+ const thumb = thumbs(overview)[0];
129
+ const iconTitle = (thumb.querySelector('.icon-title-box') as HTMLElement).firstElementChild as HTMLElement;
130
+ expect(iconTitle.localName).toBe('gtk-image');
131
+ view.setPageLoading('tab-1', true);
132
+ expect((thumb.querySelector('.icon-title-box') as HTMLElement).firstElementChild?.localName).toBe(
133
+ 'adw-spinner',
134
+ );
135
+ view.setPageLoading('tab-1', false);
136
+ expect((thumb.querySelector('.icon-title-box') as HTMLElement).firstElementChild?.localName).toBe(
137
+ 'gtk-image',
138
+ );
139
+ host.remove();
140
+ });
141
+
142
+ await it('shows the indicator button only for a page that has an indicator icon', async () => {
143
+ const { overview, view, host } = mount({ pages: 1 });
144
+ const indicator = thumbs(overview)[0].querySelector('.tab-indicator') as HTMLElement;
145
+ expect(indicator.hidden).toBe(true);
146
+ view.setPageIndicatorIcon('tab-1', 'dialog-warning');
147
+ expect((thumbs(overview)[0].querySelector('.tab-indicator') as HTMLElement).hidden).toBe(false);
148
+ host.remove();
149
+ });
150
+ });
151
+
152
+ await describe('<adw-tab-overview> title, header bar and empty states', async () => {
153
+ await it('pluralises the page count, and only for exactly one page', async () => {
154
+ const { overview, view, host } = mount({ pages: 3 });
155
+ const title = () => (overview.querySelector('.overview-title') as HTMLElement).textContent;
156
+ expect(title()).toBe('3 Tabs');
157
+ view.closePage('tab-3');
158
+ view.closePage('tab-2');
159
+ expect(title()).toBe('1 Tab');
160
+ view.closePage('tab-1');
161
+ expect(title()).toBe('0 Tabs');
162
+ host.remove();
163
+ });
164
+
165
+ await it('empties its title when there is no view at all', async () => {
166
+ const host = document.createElement('div');
167
+ host.innerHTML = '<adw-tab-overview></adw-tab-overview>';
168
+ document.body.appendChild(host);
169
+ const overview = host.querySelector('adw-tab-overview') as AdwTabOverview;
170
+ expect(overview.view).toBeNull();
171
+ expect((overview.querySelector('.overview-title') as HTMLElement).textContent).toBe('');
172
+ host.remove();
173
+ });
174
+
175
+ await it('hides the header bar only when search, menu and BOTH title-button sides are off', async () => {
176
+ const { overview, host } = mount({
177
+ pages: 2,
178
+ attrs: 'show-start-title-buttons="false" show-end-title-buttons="false"',
179
+ });
180
+ const header = () => (overview.querySelector('.overview-header-bar') as HTMLElement).hidden;
181
+ expect(header()).toBe(false); // search is still on
182
+ overview.setAttribute('enable-search', 'false');
183
+ expect(header()).toBe(true);
184
+ overview.setAttribute('show-start-title-buttons', 'true');
185
+ expect(header()).toBe(false);
186
+ overview.setAttribute('secondary-menu', JSON.stringify([{ label: 'New Window', action: 'win.new' }]));
187
+ expect(header()).toBe(false);
188
+ overview.setAttribute('show-start-title-buttons', 'false');
189
+ overview.setAttribute('show-end-title-buttons', 'false');
190
+ expect(header()).toBe(false); // the secondary menu is the fourth term
191
+ host.remove();
192
+ });
193
+
194
+ await it('shows "No Open Tabs" when empty, and "No Tabs Found" when the search matches nothing', async () => {
195
+ const { overview, view, host } = mount({ pages: 2 });
196
+ const empty = () => (overview.querySelector('.overview-empty-state') as HTMLElement).hidden;
197
+ const searchEmpty = () => (overview.querySelector('.overview-search-empty-state') as HTMLElement).hidden;
198
+ expect(empty()).toBe(true);
199
+ view.closePage('tab-1');
200
+ view.closePage('tab-2');
201
+ expect(empty()).toBe(false);
202
+ expect(searchEmpty()).toBe(true);
203
+
204
+ overview.setOpen(true);
205
+ (overview.querySelector('.search-button') as HTMLButtonElement).click();
206
+ const entry = searchEntry(overview);
207
+ entry.value = 'nothing matches this';
208
+ entry.dispatchEvent(new Event('input'));
209
+ expect(overview.searchActive).toBe(true);
210
+ expect(empty()).toBe(true);
211
+ expect(searchEmpty()).toBe(false);
212
+ host.remove();
213
+ });
214
+
215
+ await it('hides the new-tab button while the search is running', async () => {
216
+ const { overview, host } = mount({ pages: 2, attrs: 'enable-new-tab' });
217
+ const button = () => (overview.querySelector('.new-tab-button') as HTMLElement).hidden;
218
+ expect(button()).toBe(false);
219
+ overview.setOpen(true);
220
+ (overview.querySelector('.search-button') as HTMLButtonElement).click();
221
+ const entry = searchEntry(overview);
222
+ entry.value = 'page';
223
+ entry.dispatchEvent(new Event('input'));
224
+ expect(button()).toBe(true);
225
+ host.remove();
226
+ });
227
+ });
228
+
229
+ await describe('<adw-tab-overview> search', async () => {
230
+ await it('drives the same filter the core table pins', async () => {
231
+ for (const vector of TAB_SEARCH_VECTORS) {
232
+ const matches = tabSearchMatches(
233
+ { title: vector.title, tooltip: vector.tooltip, keyword: vector.keyword },
234
+ vector.terms,
235
+ );
236
+ expect(matches).toBe(vector.matches);
237
+ }
238
+ });
239
+
240
+ await it('hides the thumbnails that do not match, on title, tooltip and keyword', async () => {
241
+ const { overview, view, host } = mount({ pages: 3 });
242
+ view.setPageTooltip('tab-2', 'the scratch pad');
243
+ view.setPageKeyword('tab-3', 'https://example.org/history');
244
+ overview.setOpen(true);
245
+ (overview.querySelector('.search-button') as HTMLButtonElement).click();
246
+ const entry = searchEntry(overview);
247
+
248
+ const labels = () =>
249
+ thumbs(overview)
250
+ .map((thumb) => thumb.querySelector('.tab-label')?.textContent ?? '')
251
+ .join(',');
252
+
253
+ entry.value = 'scratch';
254
+ entry.dispatchEvent(new Event('input'));
255
+ expect(labels()).toBe('Page 1');
256
+
257
+ entry.value = 'example.org';
258
+ entry.dispatchEvent(new Event('input'));
259
+ expect(labels()).toBe('Page 2');
260
+
261
+ entry.value = 'page';
262
+ entry.dispatchEvent(new Event('input'));
263
+ expect(thumbs(overview)).toHaveLength(3);
264
+ host.remove();
265
+ });
266
+
267
+ await it('is "active" exactly while the entry is non-empty', async () => {
268
+ const { overview, host } = mount({ pages: 1 });
269
+ overview.setOpen(true);
270
+ (overview.querySelector('.search-button') as HTMLButtonElement).click();
271
+ const entry = searchEntry(overview);
272
+ expect(overview.searchActive).toBe(false);
273
+ entry.value = 'x';
274
+ entry.dispatchEvent(new Event('input'));
275
+ expect(overview.searchActive).toBe(true);
276
+ entry.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
277
+ expect(overview.searchActive).toBe(false);
278
+ expect(entry.value).toBe('');
279
+ host.remove();
280
+ });
281
+
282
+ await it('sends Enter to the PINNED grid first, then to the ordinary one', async () => {
283
+ const { overview, host } = mount({ pages: 2 });
284
+ overview.setOpen(true);
285
+ (overview.querySelector('.search-button') as HTMLButtonElement).click();
286
+ const entry = searchEntry(overview);
287
+ entry.value = 'page';
288
+ entry.dispatchEvent(new Event('input'));
289
+ entry.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
290
+ expect(document.activeElement === thumbs(overview)[0]).toBe(true);
291
+ host.remove();
292
+ });
293
+ });
294
+
295
+ await describe('<adw-tab-overview> actions and new tab', async () => {
296
+ await it('enables overview.open only while closed, and overview.close only with pages', async () => {
297
+ const { overview, view, host } = mount({ pages: 2 });
298
+ expect(overview.activateOverviewOpen()).toBe(true);
299
+ expect(overview.open).toBe(true);
300
+ // Already open: the action is disabled, and says so by doing nothing.
301
+ expect(overview.activateOverviewOpen()).toBe(false);
302
+ expect(overview.activateOverviewClose()).toBe(true);
303
+ expect(overview.open).toBe(false);
304
+ view.closePage('tab-1');
305
+ view.closePage('tab-2');
306
+ overview.setOpen(true);
307
+ expect(overview.activateOverviewClose()).toBe(false);
308
+ expect(overview.open).toBe(true);
309
+ host.remove();
310
+ });
311
+
312
+ await it('creates, selects and closes to the new page, focusing its content', async () => {
313
+ const { overview, view, host } = mount({ pages: 1, attrs: 'enable-new-tab' });
314
+ overview.setOpen(true);
315
+ overview.addEventListener('create-tab', (event) => {
316
+ // `appendPage` returns the POSITION the page landed at, not the page — the
317
+ // state the handler must hand back is read off the view.
318
+ const position = view.appendPage({ id: 'fresh', title: 'Fresh' });
319
+ (event as CustomEvent).detail.page = view.pages[position];
320
+ });
321
+ (overview.querySelector('.new-tab-button') as HTMLButtonElement).click();
322
+ expect(view.selectedId).toBe('fresh');
323
+ expect(overview.open).toBe(false);
324
+ host.remove();
325
+ });
326
+
327
+ await it('opens the overview from the open attribute, and reports the change', async () => {
328
+ const { overview, host } = mount({ pages: 1 });
329
+ const seen: boolean[] = [];
330
+ overview.addEventListener('notify::open', (event) => seen.push((event as CustomEvent).detail.open));
331
+ overview.setAttribute('open', '');
332
+ expect(overview.open).toBe(true);
333
+ expect((overview.querySelector('.adw-tab-overview-toolbar') as HTMLElement).hidden).toBe(false);
334
+ overview.setOpen(false);
335
+ expect(seen).toStrictEqual([true, false]);
336
+ host.remove();
337
+ });
338
+
339
+ await it('makes the covered child inert while the overview is up', async () => {
340
+ const { overview, host } = mount({ pages: 1 });
341
+ const child = overview.querySelector('.adw-tab-overview-child') as HTMLElement;
342
+ expect(child.inert).toBe(false);
343
+ overview.setOpen(true);
344
+ expect(child.inert).toBe(true);
345
+ host.remove();
346
+ });
347
+ });
348
+
349
+ await describe('<adw-tab-overview> inverted', async () => {
350
+ await it('puts the close button at the start and the indicator at the end', async () => {
351
+ const { overview, view, host } = mount({ pages: 1 });
352
+ view.setPageIndicatorIcon('tab-1', 'dialog-warning');
353
+ const thumb = () => thumbs(overview)[0];
354
+ expect(thumb().classList.contains('inverted')).toBe(false);
355
+ overview.setAttribute('inverted', '');
356
+ expect(overview.inverted).toBe(true);
357
+ expect(thumb().classList.contains('inverted')).toBe(true);
358
+ host.remove();
359
+ });
360
+ });
361
+
362
+ await describe('<adw-tab-overview> grid keyboard', async () => {
363
+ // Three 100px columns in a 340px flex-wrap box: the layout the keys measure.
364
+ const open = (pages: number) => {
365
+ const m = mount({ pages, attrs: 'open' });
366
+ const el = grid(m.overview);
367
+ el.style.cssText = 'display:flex;flex-wrap:wrap;width:340px';
368
+ const chips = thumbs(m.overview);
369
+ for (const chip of chips) chip.style.cssText = 'width:100px;height:60px';
370
+ const press = (target: HTMLElement, key: string, init: KeyboardEventInit = {}) => {
371
+ const event = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true, ...init });
372
+ target.dispatchEvent(event);
373
+ return event;
374
+ };
375
+ return { ...m, chips, press };
376
+ };
377
+
378
+ await it('every shared grid vector moves the selection as tabled', async () => {
379
+ for (const { key, from, to } of GRID_NAVIGATION_VECTORS) {
380
+ const { view, host, chips, press } = open(GRID_NAVIGATION_GEOMETRY.count);
381
+ view.setSelectedPage(chips[from].dataset.pageId as string);
382
+ chips[from].focus();
383
+ press(chips[from], key);
384
+ const expected = chips[to ?? from].dataset.pageId;
385
+ expect(`${key}@${from}=${view.selectedId}`).toBe(`${key}@${from}=${expected}`);
386
+ host.remove();
387
+ }
388
+ });
389
+
390
+ await it('ArrowDown moves focus and selection one row, ArrowUp back', async () => {
391
+ const { view, host, chips, press } = open(7);
392
+ chips[1].focus();
393
+ expect(press(chips[1], 'ArrowDown').defaultPrevented).toBe(true);
394
+ expect(view.selectedId).toBe(chips[4].dataset.pageId);
395
+ expect(document.activeElement).toBe(chips[4]);
396
+ press(chips[4], 'ArrowUp');
397
+ expect(view.selectedId).toBe(chips[1].dataset.pageId);
398
+ host.remove();
399
+ });
400
+
401
+ await it('Home and End jump to the ends', async () => {
402
+ const { view, host, chips, press } = open(7);
403
+ chips[3].focus();
404
+ press(chips[3], 'End');
405
+ expect(view.selectedId).toBe(chips[6].dataset.pageId);
406
+ press(chips[6], 'Home');
407
+ expect(view.selectedId).toBe(chips[0].dataset.pageId);
408
+ host.remove();
409
+ });
410
+
411
+ await it('Enter selects the focused thumbnail and closes the overview', async () => {
412
+ const { overview, view, host, chips, press } = open(3);
413
+ chips[2].focus();
414
+ expect(press(chips[2], 'Enter').defaultPrevented).toBe(true);
415
+ expect(view.selectedId).toBe(chips[2].dataset.pageId);
416
+ expect(overview.open).toBe(false);
417
+ host.remove();
418
+ });
419
+
420
+ await it('arrows with a modifier are left to the browser', async () => {
421
+ const { view, host, chips, press } = open(3);
422
+ const before = view.selectedId;
423
+ expect(press(chips[0], 'ArrowRight', { ctrlKey: true }).defaultPrevented).toBe(false);
424
+ expect(view.selectedId).toBe(before);
425
+ host.remove();
426
+ });
427
+ });
428
+
429
+ await describe('<adw-tab-overview> serial safety', async () => {
430
+ await it('keeps two overviews apart', async () => {
431
+ serial += 1;
432
+ expect(serial).toBeGreaterThan(0);
433
+ const a = mount({ pages: 1 });
434
+ const b = mount({ pages: 2 });
435
+ expect(a.overview.view).toBe(a.view);
436
+ expect(b.overview.view).toBe(b.view);
437
+ expect(thumbs(a.overview)).toHaveLength(1);
438
+ expect(thumbs(b.overview)).toHaveLength(2);
439
+ a.host.remove();
440
+ b.host.remove();
441
+ });
442
+ });
443
+ };