@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
@@ -27,6 +27,15 @@
27
27
  @use 'labels';
28
28
  // <gtk-box>. Before every widget, which may place its own children in one.
29
29
  @use 'box';
30
+ // The five Gtk layout containers after it, and they are here for ONE reason each: nothing
31
+ // downstream of `box` needs to place children in one, and the frame's 1px border is the
32
+ // only rule libadwaita writes for any of the five (`_misc.scss:4-15`) — so they belong with
33
+ // the primitive they build on rather than in the widget run below.
34
+ @use 'frame';
35
+ @use 'aspect_frame';
36
+ @use 'center_box';
37
+ @use 'grid';
38
+ @use 'fixed';
30
39
  // The REST of libadwaita's documented style-class surface — the widget-
31
40
  // independent half: the surfaces (`.background`, `.view`, `.frame`), `.card` and
32
41
  // the two boxed lists, `.toolbar`, `.spacer`, `.osd`, `.linked`, the app-icon
@@ -37,14 +46,32 @@
37
46
  // documented surface and fails on a class with no rule behind it.
38
47
  @use 'style_classes';
39
48
  @use 'window';
49
+ @use 'application_window';
50
+ // <adw-header-bar>, <gtk-header-bar> AND <gtk-window-controls>, in ONE partial because
51
+ // upstream's `_header-bar.scss` styles `headerbar`, `windowcontrols` and `windowtitle`
52
+ // together — and because a bar's frame buttons ARE its window controls.
40
53
  @use 'headerbar';
41
54
  @use 'action_bar';
42
55
  @use 'window_title';
43
56
  @use 'button';
57
+ // The four button-derived nodes below, in the order of `src/elements/`: each one
58
+ // renders a `.adw-button` of its own, so each rule comes AFTER `button` rather than
59
+ // before it — `button.link`'s transparent background is the whole point of a link and
60
+ // `.adw-button`'s resting fill must not win it on source order.
61
+ @use 'link';
62
+ @use 'scale_button';
63
+ @use 'color_button';
64
+ @use 'font_button';
44
65
  @use 'button_content';
45
66
  // The ONE popover surface. Emitted BEFORE the widgets that host one, so a
46
67
  // consumer's (or a widget's) own higher-specificity rule still wins over it.
47
68
  @use 'popover';
69
+ // <gtk-popover-menu>, <gtk-popover-menu-bar> and <gtk-popover-bin>. All three AFTER
70
+ // `popover`, because every surface they own is `<gtk-popover>`'s and none of them restates
71
+ // it — they add the menubar's item rules and the bin's `.has-open-popup`, and libadwaita
72
+ // puts both in the same file as `popover.menu` for the same reason.
73
+ @use 'popover_menu_bar';
74
+ @use 'popover_bin';
48
75
  @use 'split_button';
49
76
  @use 'menu_button';
50
77
  @use 'drop_down';
@@ -54,14 +81,73 @@
54
81
  // own copy of it until it was lifted out of `adw-switch-row {}`.
55
82
  @use 'switch';
56
83
  @use 'entry';
84
+ @use 'search_entry';
85
+ @use 'password_entry';
86
+ @use 'separator';
87
+ // `<gtk-text>`, `<gtk-text-view>` and `<gtk-editable-label>` — the widgets whose content is
88
+ // text, and the two libadwaita blocks that paint a `text` node.
89
+ @use 'text';
90
+ // `<gtk-search-bar>`, which reads the header-bar tokens rather than the header bar's rules.
91
+ @use 'search_bar';
92
+ // <gtk-drawing-area>, the one widget of the gtk/drawing page that carries a rule of its
93
+ // own. No dependency on anything above it — it styles one canvas — so the order here is
94
+ // placement, not precedence.
95
+ @use 'drawing';
96
+ // The `dnd` node, which libadwaita styles once for the whole widget
97
+ // (`_common.scss:30-32`) and which is otherwise geometry: a drag icon has no parent to lay
98
+ // out in, because it is a GtkRoot with its own surface. No dependency on anything above it.
99
+ @use 'drag_icon';
100
+ // The layout CONTAINERS GTK owns and libadwaita only styles. `_paned` draws the divider as
101
+ // an inset box-shadow on the `separator` node a `GtkPanedHandle` carries, which is a
102
+ // different rule from `<gtk-separator>`'s own fill — so it needs its own partial rather
103
+ // than a class the separator's rule would fight over.
104
+ @use 'overlay';
105
+ @use 'revealer';
106
+ @use 'paned';
107
+ @use 'expander';
57
108
  // The two form-control primitives, in ONE partial because upstream merges them
58
109
  // (there is no `_radio.scss` in libadwaita) — see _checks.scss.
59
110
  @use 'checks';
111
+ @use 'spin_button';
112
+ @use 'scale';
60
113
  @use 'progress_bar';
114
+ // <gtk-level-bar>, next to the progress bar it is easy to confuse with. It has no
115
+ // dependency on anything above it, so the order here is readability, not precedence.
116
+ @use 'level_bar';
117
+ // The three views, in dependency order: `list_view` declares the selectable-row mixin
118
+ // and the rubber band that the other two include.
119
+ @use 'list_view';
120
+ @use 'grid_view';
121
+ @use 'column_view';
122
+ @use 'tree_expander';
123
+ // The media group, in dependency order and nothing else: `picture` fits a replaced
124
+ // element, `inscription` is text measured in characters and lines, `video` lays an
125
+ // overlay out and hosts a `media_controls` inside its revealer, so `media_controls`
126
+ // comes after `video` only in the sense that `video` NAMES it — neither partial reads
127
+ // the other, and the order here is readability, not precedence.
128
+ @use 'picture';
129
+ @use 'inscription';
130
+ @use 'video';
131
+ @use 'media_controls';
132
+ // The two child-holding containers. `list_box` comes first only because it reads like
133
+ // `list_view`; nothing here is a `@use` of the other, and `flow_box` includes the selectable
134
+ // mixin from `list_view` above for the cell's four state colours.
135
+ @use 'list_box';
136
+ @use 'flow_box';
137
+ @use 'calendar';
61
138
  @use 'preferences';
139
+ @use 'preferences_row';
62
140
  @use 'card';
63
141
  @use 'data_grid';
142
+ @use 'bin';
64
143
  @use 'clamp';
144
+ // <gtk-stack> AND <gtk-stack-switcher> AND <gtk-stack-sidebar>, in ONE partial: upstream
145
+ // styles the switcher's buttons out of `_buttons.scss` and the sidebar's rows out of
146
+ // `_sidebars.scss`, so a stack and the two things that switch over it share styles.
147
+ @use 'stack';
148
+ @use 'clamp_scrollable';
149
+ // <adw-spinner> AND <gtk-spinner>, in ONE partial because upstream's
150
+ // `_spinner.scss` styles `spinner` and `image.spinner` in the same file.
65
151
  @use 'spinner';
66
152
  // <adw-shortcut-label>'s keycaps. After `labels`, because a separator inside it
67
153
  // is an ordinary `.dimmed`.
@@ -80,24 +166,47 @@
80
166
  @use 'password_entry_row';
81
167
  @use 'toast';
82
168
  @use 'toolbar_view';
169
+ // The scrolling trio, beside `_scrolling.scss`'s edge indicators: the scrollbar first,
170
+ // because the scrolled window's grid places it, and the viewport before the window, because
171
+ // the window's grid has a cell for it.
172
+ @use 'scrollbar';
173
+ @use 'viewport';
174
+ @use 'scrolled_window';
175
+ @use 'window_handle';
83
176
  @use 'scrolling';
84
177
  @use 'wrap_box';
85
178
  @use 'panes';
86
179
  @use 'overlay_split_view';
87
180
  @use 'navigation_split_view';
88
181
  @use 'carousel';
182
+ // <adw-tab-bar> BEFORE <adw-tab-view>, and only because upstream writes both in ONE file:
183
+ // `tabbar`, `tabbox` and `tab` (_tab-view.scss:1-95). The chip rules here and the merged
184
+ // bar's are the same declarations against the same class names, so whichever partial is
185
+ // emitted second would win on source order for a document that nests one bar in the other.
186
+ @use 'tab_bar';
89
187
  @use 'tab_view';
90
188
  @use 'view_switcher';
91
189
  @use 'inline_view_switcher';
92
190
  @use 'view_stack';
93
191
  @use 'view_switcher_bar';
192
+ @use 'tab_button';
193
+ @use 'tab_overview';
194
+ @use 'view_switcher_sidebar';
94
195
  @use 'navigation_view';
95
196
  @use 'bottom_sheet';
96
197
  @use 'sidebar';
198
+ // GTK's own dialogs: the about window's layout, the emoji chooser's nodes, and the two
199
+ // Unix print dialogs. After `popover` and `entry`, which the emoji chooser hosts.
200
+ @use 'gtk_about_dialog';
201
+ @use 'emoji_chooser';
202
+ @use 'print_dialogs';
97
203
  @use 'about_dialog';
98
204
  @use 'alert_dialog';
99
205
  @use 'preferences_dialog';
100
206
  @use 'dialog';
207
+ // After 'dialog': the shortcuts dialog IS an <adw-dialog> and adds sections and rows
208
+ // inside its content area, so its own rules have to come after the chrome they sit in.
209
+ @use 'shortcuts_dialog';
101
210
  // Last among the widgets: an authored `halign` / `valign` is placement the author asked
102
211
  // for, and an element rule that sets a margin must not win it back on source order.
103
212
  @use 'widget';
@@ -246,6 +246,82 @@ export const AdwActionRowsTest = async () => {
246
246
  }
247
247
  });
248
248
 
249
+ await describe('<adw-switch-row> prefix slot (inherited add_prefix)', async () => {
250
+ // Routing a live child and then deriving the box's emptiness are TWO observers in
251
+ // a chain: `slotted-children` moves the node into the box, and only that move is
252
+ // what `bindEmptySections` observes. One checkpoint sees the routing, two see the
253
+ // derivation.
254
+ const settleSlot = async () => {
255
+ await Promise.resolve();
256
+ await Promise.resolve();
257
+ };
258
+ await it('routes a DECLARED slot="prefix" child into the prefix box', () => {
259
+ // Adw.SwitchRow IS an AdwActionRow (adw-switch-row.c:50), so `add_prefix`
260
+ // and the box that carries it are inherited, not a web-only addition.
261
+ // The child is authored BEFORE the row reaches the document, which is the
262
+ // install pass rather than the observer.
263
+ const host = document.createElement('div');
264
+ document.body.appendChild(host);
265
+ const row = document.createElement('adw-switch-row') as AdwSwitchRow;
266
+ const icon = document.createElement('span');
267
+ icon.id = 'lead';
268
+ icon.setAttribute('slot', 'prefix');
269
+ row.appendChild(icon);
270
+ host.appendChild(row);
271
+
272
+ expect(icon.parentElement?.className).toBe('adw-switch-row-prefix');
273
+ host.remove();
274
+ });
275
+
276
+ await it('hides the box while it is empty', () => {
277
+ const { el: row, host } = mount<AdwSwitchRow>('adw-switch-row');
278
+ const box = row.querySelector('.adw-switch-row-prefix') as HTMLElement;
279
+ expect(box.hidden).toBe(true);
280
+ host.remove();
281
+ });
282
+
283
+ await it('routes a prefix appended AFTER connect, and un-hides the box', async () => {
284
+ // The live half: a renderer mounts the row and then appends the icon, which
285
+ // is a MutationObserver callback rather than the install pass — the incident
286
+ // `src/slotted-children.ts` records for 42 elements that snapshotted instead.
287
+ const { el: row, host } = mount<AdwSwitchRow>('adw-switch-row');
288
+ const box = row.querySelector('.adw-switch-row-prefix') as HTMLElement;
289
+
290
+ const icon = document.createElement('span');
291
+ icon.setAttribute('slot', 'prefix');
292
+ row.appendChild(icon);
293
+ await settleSlot();
294
+
295
+ expect(icon.parentElement).toBe(box);
296
+ expect(box.hidden).toBe(false);
297
+ host.remove();
298
+ });
299
+
300
+ await it('shows it again when the last prefix child leaves', async () => {
301
+ const { el: row, host } = mount<AdwSwitchRow>('adw-switch-row');
302
+ const icon = document.createElement('span');
303
+ icon.setAttribute('slot', 'prefix');
304
+ row.appendChild(icon);
305
+ await settleSlot();
306
+ const box = row.querySelector('.adw-switch-row-prefix') as HTMLElement;
307
+
308
+ expect(box.hidden).toBe(false);
309
+ icon.remove();
310
+ await Promise.resolve();
311
+ expect(box.hidden).toBe(true);
312
+ host.remove();
313
+ });
314
+
315
+ await it('exposes the box as prefixSection for the imperative spelling', () => {
316
+ const { el: row, host } = mount<AdwSwitchRow>('adw-switch-row');
317
+ const icon = document.createElement('span');
318
+ row.prefixSection.appendChild(icon);
319
+
320
+ expect(icon.parentElement).toBe(row.prefixSection);
321
+ host.remove();
322
+ });
323
+ });
324
+
249
325
  await describe('<adw-button-row> (libadwaita conformance vectors)', async () => {
250
326
  for (const vector of BUTTON_ROW_ICON_VECTORS) {
251
327
  await it(`${JSON.stringify([vector.startIconName, vector.endIconName])} — ${vector.rule}`, () => {
@@ -0,0 +1,118 @@
1
+ // DOM-level behaviour tests for <adw-application-window>. Runs in a real browser via the
2
+ // @gjsify/adwaita-web browser test axis (tests/browser Playwright harness). The custom
3
+ // elements are registered by importing the package root in test.browser.mts; these specs
4
+ // create elements via document.createElement and assert their DOM behaviour.
5
+ //
6
+ // The subject is the MENUBAR and the inheritance: `Adw.ApplicationWindow` is
7
+ // `Adw.Window` plus `Gtk.ApplicationWindow:show-menubar`, so the window half is
8
+ // <adw-window>'s spec and only the delta is asserted here.
9
+ import { describe, it, expect } from '@gjsify/unit';
10
+
11
+ import type { AdwApplicationWindow } from './elements/adw-application-window.js';
12
+
13
+ const MENU_MODEL = [
14
+ {
15
+ label: 'File',
16
+ submenu: [
17
+ { label: 'New Window', action: 'app.new-window' },
18
+ { label: 'Quit', action: 'app.quit' },
19
+ ],
20
+ },
21
+ { label: 'Help', action: 'app.help' },
22
+ ];
23
+
24
+ function makeWindow(model: unknown = MENU_MODEL): AdwApplicationWindow {
25
+ const el = document.createElement('adw-application-window') as AdwApplicationWindow;
26
+ el.setAttribute('menu-model', JSON.stringify(model));
27
+ el.innerHTML = '<p>Content</p>';
28
+ document.body.appendChild(el);
29
+ return el;
30
+ }
31
+
32
+ export const AdwApplicationWindowTest = async () => {
33
+ await describe('adw-application-window is an adw-window', async () => {
34
+ await it('places children in the inherited content area', async () => {
35
+ const win = makeWindow();
36
+ expect(win.querySelector('.adw-window-content')?.querySelector('p')?.textContent).toBe('Content');
37
+ win.remove();
38
+ });
39
+
40
+ await it('keeps the inherited size request', async () => {
41
+ const win = makeWindow();
42
+ expect(win.style.width).toBe('360px');
43
+ win.setAttribute('width', '520');
44
+ expect(win.style.width).toBe('520px');
45
+ win.remove();
46
+ });
47
+ });
48
+
49
+ await describe('adw-application-window menubar', async () => {
50
+ await it('draws no bar without show-menubar', async () => {
51
+ const win = makeWindow();
52
+ expect(win.showMenubar).toBe(false);
53
+ expect(win.menubar?.hidden).toBe(true);
54
+ win.remove();
55
+ });
56
+
57
+ await it('draws no bar for an application that installed no menu', async () => {
58
+ // The GTK half of the same rule: a window with no model has no menubar,
59
+ // however the flag reads.
60
+ const win = makeWindow([]);
61
+ win.setAttribute('show-menubar', '');
62
+ expect(win.menubar?.hidden).toBe(true);
63
+ win.remove();
64
+ });
65
+
66
+ await it('a submenu becomes a menu button and a bare item a flat button', async () => {
67
+ const win = makeWindow();
68
+ win.setAttribute('show-menubar', '');
69
+
70
+ expect(win.menubar?.hidden).toBe(false);
71
+ const menuButton = win.menubar?.querySelector('gtk-menu-button');
72
+ expect(menuButton?.getAttribute('menu-title')).toBe('File');
73
+ const help = win.menubar?.querySelector('gtk-button');
74
+ expect(help?.getAttribute('label')).toBe('Help');
75
+ win.remove();
76
+ });
77
+
78
+ await it('the menubar sits above the content, inside the content area', async () => {
79
+ // It is a child of `.adw-window-content` rather than a sibling: the window's
80
+ // own slot binding would re-home a sibling into the content on the next tick.
81
+ const win = makeWindow();
82
+ win.setAttribute('show-menubar', '');
83
+ expect(win.contentArea.firstElementChild).toBe(win.menubar);
84
+ win.remove();
85
+ });
86
+
87
+ await it('the flag alone shows and hides the bar without a rebuild', async () => {
88
+ const win = makeWindow();
89
+ win.setAttribute('show-menubar', '');
90
+ expect(win.menubar?.hidden).toBe(false);
91
+ win.removeAttribute('show-menubar');
92
+ expect(win.menubar?.hidden).toBe(true);
93
+ win.remove();
94
+ });
95
+
96
+ await it('a bare item reports its activation the way every menu surface does', async () => {
97
+ const win = makeWindow();
98
+ win.setAttribute('show-menubar', '');
99
+ const seen: unknown[] = [];
100
+ win.addEventListener('menu-item-activated', (e) => seen.push((e as CustomEvent).detail));
101
+ (win.menubar?.querySelector('gtk-button') as HTMLButtonElement | null)?.click();
102
+ expect(seen).toStrictEqual([{ id: 'Help', label: 'Help', path: [1] }]);
103
+ win.remove();
104
+ });
105
+
106
+ await it('a broken model is dropped rather than thrown', async () => {
107
+ // `parseMenuModel` is total by construction: a typo in markup must not take
108
+ // the window down with it.
109
+ const win = document.createElement('adw-application-window') as AdwApplicationWindow;
110
+ win.setAttribute('menu-model', '{not json');
111
+ win.setAttribute('show-menubar', '');
112
+ document.body.appendChild(win);
113
+ expect(win.menuModel).toStrictEqual([]);
114
+ expect(win.menubar?.hidden).toBe(true);
115
+ win.remove();
116
+ });
117
+ });
118
+ };
@@ -0,0 +1,75 @@
1
+ // DOM-level tests for <adw-bin>: the ONE child a bin holds, that `setChild` REPLACES
2
+ // rather than stacks (adw-bin.c:193-219), and that a child which already has a parent
3
+ // is refused the way C's `g_return_if_fail (gtk_widget_get_parent (child) == NULL)`
4
+ // refuses it.
5
+ import { describe, expect, it } from '@gjsify/unit';
6
+
7
+ import type { AdwBin } from './elements/adw-bin.js';
8
+
9
+ function mount(children: Node[] = []): { el: AdwBin; host: HTMLElement } {
10
+ const host = document.createElement('div');
11
+ document.body.appendChild(host);
12
+ const el = document.createElement('adw-bin') as AdwBin;
13
+ host.appendChild(el);
14
+ for (const child of children) el.appendChild(child);
15
+ return { el, host };
16
+ }
17
+
18
+ export const AdwBinTest = async () => {
19
+ await describe('<adw-bin> one child', async () => {
20
+ await it('holds whatever it was given, and reports it as `child`', () => {
21
+ const label = document.createElement('div');
22
+ const { el, host } = mount([label]);
23
+ expect(el.child).toBe(label);
24
+ expect(el.childElementCount).toBe(1);
25
+ host.remove();
26
+ });
27
+
28
+ await it('a second child REPLACES the first, which is what adw_bin_set_child does', async () => {
29
+ const first = document.createElement('div');
30
+ const second = document.createElement('div');
31
+ const { el, host } = mount([first]);
32
+ el.appendChild(second);
33
+ await new Promise<void>((resolve) => setTimeout(resolve, 0));
34
+ expect(el.child).toBe(second);
35
+ expect(el.childElementCount).toBe(1);
36
+ expect(first.parentNode).toBeNull();
37
+ host.remove();
38
+ });
39
+
40
+ await it('setChild notifies once, and not for the child it already holds', async () => {
41
+ const { el, host } = mount();
42
+ const details: unknown[] = [];
43
+ el.addEventListener('notify::child', (event) => details.push((event as CustomEvent).detail));
44
+ const child = document.createElement('div');
45
+ el.child = child;
46
+ expect(el.child).toBe(child);
47
+ el.setChild(child);
48
+ expect(details).toStrictEqual([{ child }]);
49
+ host.remove();
50
+ });
51
+
52
+ await it('refuses a child that already has a parent, as C does', () => {
53
+ const other = document.createElement('div');
54
+ document.body.appendChild(other);
55
+ const stray = document.createElement('span');
56
+ other.appendChild(stray);
57
+ const { el, host } = mount();
58
+ expect(() => el.setChild(stray)).toThrow();
59
+ expect(el.child).toBeNull();
60
+ host.remove();
61
+ other.remove();
62
+ });
63
+
64
+ await it('an empty bin is a block box, and its only child fills it', () => {
65
+ const { el, host } = mount([document.createElement('div')]);
66
+ // A bin takes the size it is GIVEN and hands all of it to the child, which
67
+ // `GtkBinLayout` does on both axes (gtkbinlayout.c:81).
68
+ el.style.height = '120px';
69
+ expect(getComputedStyle(el).display).toBe('block');
70
+ const child = el.firstElementChild as HTMLElement;
71
+ expect(child.getBoundingClientRect().height).toBe(120);
72
+ host.remove();
73
+ });
74
+ });
75
+ };