@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,281 @@
1
+ // DOM-level tests for <adw-view-switcher-sidebar>: the sidebar-shaped switcher that
2
+ // drives an <adw-view-stack>. What is C here is the GROUPING (`populate_sidebar`), the
3
+ // index for activation (`activated_cb`), the indicator's three states (`update_badge`)
4
+ // and the direction of the selection (`selection_changed_cb`) — so those are what the
5
+ // rows below pin, on top of the shared section vectors.
6
+ import { describe, expect, it } from '@gjsify/unit';
7
+
8
+ import { VIEW_SWITCHER_SIDEBAR_SECTION_VECTORS } from '@gjsify/adwaita-core/conformance';
9
+ import { createViewSwitcherPage, viewSwitcherSidebarSections } from '@gjsify/adwaita-core';
10
+
11
+ import type { AdwViewSwitcherSidebar } from './elements/adw-view-switcher-sidebar.js';
12
+ import type { AdwViewStack } from './elements/adw-view-stack.js';
13
+
14
+ interface PageSpec {
15
+ name: string;
16
+ title?: string;
17
+ icon?: string;
18
+ startsSection?: string;
19
+ badge?: string;
20
+ attention?: boolean;
21
+ hidden?: boolean;
22
+ }
23
+
24
+ function mount(
25
+ pages: PageSpec[],
26
+ attrs = '',
27
+ ): {
28
+ sidebar: AdwViewSwitcherSidebar;
29
+ stack: AdwViewStack;
30
+ host: HTMLElement;
31
+ } {
32
+ const host = document.createElement('div');
33
+ const inner = pages
34
+ .map(
35
+ (page) =>
36
+ `<adw-view-stack-page name="${page.name}"${page.title ? ` title="${page.title}"` : ''}` +
37
+ `${page.icon ? ` icon-name="${page.icon}"` : ''}${page.startsSection ? ` starts-section` : ''}` +
38
+ `${page.startsSection && page.startsSection !== 'true' ? ` section-title="${page.startsSection}"` : ''}` +
39
+ `${page.badge ? ` badge-number="${page.badge}"` : ''}${page.attention ? ' needs-attention' : ''}` +
40
+ `${page.hidden ? ' hidden' : ''}></adw-view-stack-page>`,
41
+ )
42
+ .join('');
43
+ // A plain row, NOT an <adw-navigation-split-view>: libadwaita refuses anything but an
44
+ // `Adw.NavigationPage` in either pane (`g_return_if_fail (ADW_IS_NAVIGATION_PAGE …)`,
45
+ // adw-navigation-split-view.c), so the split view would drop both of these rather
46
+ // than showing them side by side.
47
+ host.innerHTML =
48
+ `<div class="stage" style="display:flex">` +
49
+ `<adw-view-switcher-sidebar ${attrs}></adw-view-switcher-sidebar>` +
50
+ `<adw-view-stack>${inner}</adw-view-stack>` +
51
+ `</div>`;
52
+ document.body.appendChild(host);
53
+ return {
54
+ sidebar: host.querySelector('adw-view-switcher-sidebar') as AdwViewSwitcherSidebar,
55
+ stack: host.querySelector('adw-view-stack') as AdwViewStack,
56
+ host,
57
+ };
58
+ }
59
+
60
+ const rows = (sidebar: AdwViewSwitcherSidebar): HTMLElement[] =>
61
+ Array.from(sidebar.querySelectorAll('adw-sidebar > .adw-sidebar-list .adw-sidebar-item'));
62
+ const headings = (sidebar: AdwViewSwitcherSidebar): string[] =>
63
+ Array.from(sidebar.querySelectorAll('adw-sidebar .adw-sidebar-section-heading')).map((el) => el.textContent ?? '');
64
+ const indicator = (sidebar: AdwViewSwitcherSidebar, row: number): HTMLElement =>
65
+ rows(sidebar)[row].querySelector('.indicator') as HTMLElement;
66
+
67
+ export const AdwViewSwitcherSidebarTest = async () => {
68
+ await describe('viewSwitcherSidebarSections (populate_sidebar)', async () => {
69
+ await it('drives the same grouping the conformance table pins', async () => {
70
+ for (const vector of VIEW_SWITCHER_SIDEBAR_SECTION_VECTORS) {
71
+ const names = vector.pages === '' ? [] : vector.pages.split(',');
72
+ const starts = vector.starts === '' ? [] : vector.starts.split(',');
73
+ const pages = names.map((name) =>
74
+ createViewSwitcherPage({
75
+ name,
76
+ startsSection: starts.includes(name),
77
+ sectionTitle: vector.sections.split(',')[starts.indexOf(name)] ?? null,
78
+ }),
79
+ );
80
+ const sections = viewSwitcherSidebarSections(pages);
81
+ expect(sections.map((section) => section.pages.map((page) => page.name).join(','))).toStrictEqual(
82
+ vector.groups === '' ? [] : vector.groups.split('/'),
83
+ );
84
+ }
85
+ });
86
+ });
87
+
88
+ await describe('<adw-view-switcher-sidebar> sections', async () => {
89
+ await it('gives every stack page a row, in stack order', async () => {
90
+ const { sidebar, host } = mount([
91
+ { name: 'inbox', title: 'Inbox', icon: 'mail-unread' },
92
+ { name: 'drafts', title: 'Drafts' },
93
+ ]);
94
+ expect(rows(sidebar)).toHaveLength(2);
95
+ expect(rows(sidebar)[0].querySelector('.adw-sidebar-item-title')?.textContent).toBe('Inbox');
96
+ expect(rows(sidebar)[1].querySelector('.adw-sidebar-item-title')?.textContent).toBe('Drafts');
97
+ expect((rows(sidebar)[0].querySelector('.adw-sidebar-item-icon') as HTMLElement).hidden).toBe(false);
98
+ host.remove();
99
+ });
100
+
101
+ await it('splits the pages at starts-section, headed by section-title', async () => {
102
+ const { sidebar, host } = mount([
103
+ { name: 'inbox', title: 'Inbox' },
104
+ { name: 'drafts', title: 'Drafts' },
105
+ { name: 'archive', title: 'Archive', startsSection: 'Archive' },
106
+ ]);
107
+ expect(rows(sidebar)).toHaveLength(3);
108
+ expect(headings(sidebar)).toStrictEqual(['Archive']);
109
+ // ONE header, and it is the titled one: the leading untitled section draws
110
+ // NOTHING, because `create_header` binds that stack's `visible` to
111
+ // `string_is_not_empty (title)` (adw-sidebar.c:1461-1467) — the header C builds
112
+ // there is invisible, so there is no separator to count either.
113
+ expect(sidebar.querySelectorAll('adw-sidebar .adw-sidebar-section-header')).toHaveLength(1);
114
+ host.remove();
115
+ });
116
+
117
+ await it('draws a separator, not a second heading, for an untitled section after the first', async () => {
118
+ // The untitled section opens on `archive` and holds `spam` with it, so the
119
+ // separator C binds (`get_header_stack_page` → "separator", :1425-1434) is the
120
+ // only header between the two.
121
+ const { sidebar, host } = mount([
122
+ { name: 'inbox', title: 'Inbox' },
123
+ { name: 'archive', title: 'Archive', startsSection: 'true' },
124
+ { name: 'spam', title: 'Spam' },
125
+ ]);
126
+ expect(rows(sidebar)).toHaveLength(3);
127
+ // The leading section is untitled too — `section-title` is the only thing that
128
+ // titles a section, and `inbox` declares none — so `Archive`'s section is the
129
+ // separator's and there is no heading at all.
130
+ expect(headings(sidebar)).toStrictEqual([]);
131
+ expect(sidebar.querySelectorAll('adw-sidebar .adw-sidebar-section-header.separator')).toHaveLength(1);
132
+ host.remove();
133
+ });
134
+
135
+ await it('keeps a hidden page as a row, because C binds visible rather than dropping it', async () => {
136
+ const { sidebar, host } = mount([
137
+ { name: 'inbox', title: 'Inbox' },
138
+ { name: 'drafts', title: 'Drafts', hidden: true },
139
+ ]);
140
+ expect(rows(sidebar)).toHaveLength(2);
141
+ expect(rows(sidebar)[1].hidden).toBe(true);
142
+ host.remove();
143
+ });
144
+ });
145
+
146
+ await describe('<adw-view-switcher-sidebar> selection and activation', async () => {
147
+ await it('marks the row of the stack’s visible page, and follows a later change', async () => {
148
+ const { sidebar, stack, host } = mount([
149
+ { name: 'inbox', title: 'Inbox' },
150
+ { name: 'drafts', title: 'Drafts' },
151
+ ]);
152
+ expect(rows(sidebar)[0].classList.contains('selected')).toBe(true);
153
+ stack.visibleChildName = 'drafts';
154
+ expect(rows(sidebar)[1].classList.contains('selected')).toBe(true);
155
+ expect(rows(sidebar)[0].classList.contains('selected')).toBe(false);
156
+ host.remove();
157
+ });
158
+
159
+ await it('activates the page at the same index, and only then emits activated', async () => {
160
+ const { sidebar, stack, host } = mount([
161
+ { name: 'inbox', title: 'Inbox' },
162
+ { name: 'drafts', title: 'Drafts' },
163
+ { name: 'sent', title: 'Sent' },
164
+ ]);
165
+ const seen: { index: number; visible: string }[] = [];
166
+ sidebar.addEventListener('activated', (event) => {
167
+ seen.push({
168
+ index: (event as CustomEvent).detail.index,
169
+ // The stack has ALREADY moved — that is the C order (:104-112).
170
+ visible: stack.visibleChildName,
171
+ });
172
+ });
173
+ rows(sidebar)[0].click();
174
+ const afterFirst = seen.length;
175
+ rows(sidebar)[2].click();
176
+ // ONE event per click, and `seen` is BOTH of them: the first row was the
177
+ // visible page already, and C activates a selected row like any other.
178
+ expect({ afterFirst, name: stack.visibleChildName, seen }).toStrictEqual({
179
+ afterFirst: 1,
180
+ name: 'sent',
181
+ seen: [
182
+ { index: 0, visible: 'inbox' },
183
+ { index: 2, visible: 'sent' },
184
+ ],
185
+ });
186
+ host.remove();
187
+ });
188
+ });
189
+
190
+ await describe('<adw-view-switcher-sidebar> indicator (update_badge)', async () => {
191
+ await it('draws no bin at all for a page with neither dot nor count', async () => {
192
+ const { sidebar, host } = mount([{ name: 'inbox', title: 'Inbox' }]);
193
+ expect(indicator(sidebar, 0).hidden).toBe(true);
194
+ host.remove();
195
+ });
196
+
197
+ await it('draws a bare dot for needs-attention with no count', async () => {
198
+ const { sidebar, host } = mount([{ name: 'inbox', title: 'Inbox', attention: true }]);
199
+ const bin = indicator(sidebar, 0);
200
+ expect(bin.hidden).toBe(false);
201
+ expect(bin.classList.contains('dot')).toBe(true);
202
+ expect(bin.classList.contains('needs-attention')).toBe(true);
203
+ expect(bin.querySelector('.numeric')).toBeNull();
204
+ host.remove();
205
+ });
206
+
207
+ await it('replaces the dot with the count, and caps it above 999', async () => {
208
+ const { sidebar, host } = mount([
209
+ { name: 'a', title: 'A', badge: '3' },
210
+ { name: 'b', title: 'B', badge: '999' },
211
+ { name: 'c', title: 'C', badge: '1000', attention: true },
212
+ ]);
213
+ expect(indicator(sidebar, 0).classList.contains('dot')).toBe(false);
214
+ expect(indicator(sidebar, 0).querySelector('.numeric')?.textContent).toBe('3');
215
+ // `> 999`, so 999 itself prints.
216
+ expect(indicator(sidebar, 1).querySelector('.numeric')?.textContent).toBe('999');
217
+ expect(indicator(sidebar, 2).querySelector('.numeric')?.textContent).toBe('999+');
218
+ expect(indicator(sidebar, 2).classList.contains('needs-attention')).toBe(true);
219
+ host.remove();
220
+ });
221
+ });
222
+
223
+ await describe('<adw-view-switcher-sidebar> mode, filter and placeholder', async () => {
224
+ await it('switches the sidebar between sidebar and page mode', async () => {
225
+ const { sidebar, host } = mount([{ name: 'inbox', title: 'Inbox' }]);
226
+ const inner = sidebar.querySelector('adw-sidebar') as HTMLElement;
227
+ expect(inner.classList.contains('page')).toBe(false);
228
+ sidebar.setAttribute('mode', 'page');
229
+ expect(sidebar.mode).toBe('page');
230
+ expect(inner.classList.contains('page')).toBe(true);
231
+ host.remove();
232
+ });
233
+
234
+ await it('shows the placeholder when the filter takes every row, and hides it again', async () => {
235
+ const { sidebar, host } = mount([
236
+ { name: 'inbox', title: 'Inbox' },
237
+ { name: 'drafts', title: 'Drafts' },
238
+ ]);
239
+ const placeholder = sidebar.querySelector('.view-switcher-sidebar-placeholder') as HTMLElement;
240
+ expect(placeholder.hidden).toBe(true);
241
+
242
+ const status = document.createElement('adw-status-page');
243
+ status.setAttribute('icon', 'system-search');
244
+ status.setAttribute('title', 'Nothing Found');
245
+ sidebar.placeholder = status;
246
+ // EVERY row, which is the condition `update_placeholder` binds the placeholder
247
+ // to — a filter that leaves one row standing leaves the placeholder hidden, so
248
+ // `() => false` is the only predicate this test's name describes.
249
+ sidebar.filter = () => false;
250
+ expect(placeholder.hidden).toBe(false);
251
+ expect(placeholder.contains(status)).toBe(true);
252
+
253
+ sidebar.filter = null;
254
+ expect(placeholder.hidden).toBe(true);
255
+ host.remove();
256
+ });
257
+
258
+ await it('accepts a stack by id, the way the property takes the element', async () => {
259
+ const host = document.createElement('div');
260
+ host.innerHTML =
261
+ `<adw-view-stack id="pages"><adw-view-stack-page name="a" title="A"></adw-view-stack-page></adw-view-stack>` +
262
+ `<adw-view-switcher-sidebar stack="pages"></adw-view-switcher-sidebar>`;
263
+ document.body.appendChild(host);
264
+ const sidebar = host.querySelector('adw-view-switcher-sidebar') as AdwViewSwitcherSidebar;
265
+ expect(sidebar.stack).toBe(host.querySelector('adw-view-stack'));
266
+ expect(rows(sidebar)).toHaveLength(1);
267
+ host.remove();
268
+ });
269
+
270
+ await it('keeps prefix and suffix out of the item list', async () => {
271
+ const host = document.createElement('div');
272
+ host.innerHTML = `<adw-view-switcher-sidebar><span slot="prefix">Top</span><span slot="suffix">Bottom</span></adw-view-switcher-sidebar>`;
273
+ document.body.appendChild(host);
274
+ const sidebar = host.querySelector('adw-view-switcher-sidebar') as AdwViewSwitcherSidebar;
275
+ expect(sidebar.prefixWidget?.textContent).toBe('Top');
276
+ expect(sidebar.suffixWidget?.textContent).toBe('Bottom');
277
+ expect(rows(sidebar)).toHaveLength(0);
278
+ host.remove();
279
+ });
280
+ });
281
+ };
@@ -0,0 +1,129 @@
1
+ // DOM-level behaviour tests for <adw-window>. Runs in a real browser via the
2
+ // @gjsify/adwaita-web browser test axis (tests/browser Playwright harness). The
3
+ // custom elements are registered by importing the package root in test.browser.mts;
4
+ // these specs create elements via document.createElement and assert their DOM
5
+ // behaviour (content area, breakpoints, dialog tracking).
6
+ import { describe, it, expect } from '@gjsify/unit';
7
+
8
+ import type { AdwWindow } from './elements/adw-window.js';
9
+
10
+ function makeWindow(html = '<p>Content</p>'): AdwWindow {
11
+ const el = document.createElement('adw-window') as AdwWindow;
12
+ el.innerHTML = html;
13
+ document.body.appendChild(el);
14
+ return el;
15
+ }
16
+
17
+ /** Wait for a ResizeObserver delivery (it runs after layout, before paint). */
18
+ function settle(): Promise<void> {
19
+ return new Promise((resolve) => {
20
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
21
+ });
22
+ }
23
+
24
+ export const AdwWindowTest = async () => {
25
+ await describe('adw-window content', async () => {
26
+ await it('places children in the content area', async () => {
27
+ const win = makeWindow('<p id="hello">Hello</p>');
28
+ const content = win.querySelector('.adw-window-content');
29
+ expect(content?.querySelector('#hello')?.textContent).toBe('Hello');
30
+ win.remove();
31
+ });
32
+
33
+ await it('content property returns the first child of the content area', async () => {
34
+ const win = makeWindow('<p id="first">First</p><p id="second">Second</p>');
35
+ expect(win.content?.id).toBe('first');
36
+ win.remove();
37
+ });
38
+
39
+ await it('content setter moves an element into the content area', async () => {
40
+ const win = makeWindow();
41
+ const p = document.createElement('p');
42
+ p.id = 'moved';
43
+ win.content = p;
44
+ expect(win.querySelector('.adw-window-content')?.querySelector('#moved')).toBe(p);
45
+ win.remove();
46
+ });
47
+
48
+ await it('applies the default 360×200 size', async () => {
49
+ const win = makeWindow();
50
+ expect(win.style.width).toBe('360px');
51
+ expect(win.style.height).toBe('200px');
52
+ win.remove();
53
+ });
54
+
55
+ await it('width/height attributes override the default size', async () => {
56
+ const win = document.createElement('adw-window') as AdwWindow;
57
+ win.setAttribute('width', '500');
58
+ win.setAttribute('height', '400');
59
+ document.body.appendChild(win);
60
+ expect(win.style.width).toBe('500px');
61
+ expect(win.style.height).toBe('400px');
62
+ win.remove();
63
+ });
64
+ });
65
+
66
+ await describe('adw-window breakpoints', async () => {
67
+ await it('addBreakpoint() returns a breakpoint and tracks it', async () => {
68
+ const win = makeWindow();
69
+ const bp = win.addBreakpoint('max-width: 500px');
70
+ expect(win.breakpoints.length).toBe(1);
71
+ expect(win.breakpoints[0]).toBe(bp);
72
+ win.remove();
73
+ });
74
+
75
+ await it('currentBreakpoint is null when no breakpoint is applied', async () => {
76
+ const win = makeWindow();
77
+ win.addBreakpoint('max-width: 100px');
78
+ // The window is wider than 100px in the test viewport.
79
+ expect(win.currentBreakpoint).toBeNull();
80
+ win.remove();
81
+ });
82
+
83
+ // A window is what a client-side route change re-parents, and `disconnectedCallback`
84
+ // releases the observer — so the bind has to come back on the next connect.
85
+ await it('re-binds the breakpoints after the window is re-attached', async () => {
86
+ const win = makeWindow();
87
+ win.addBreakpoint('max-width: 300px');
88
+ await settle();
89
+ expect(win.dataset.breakpoint).toBeUndefined();
90
+
91
+ win.remove();
92
+ document.body.appendChild(win);
93
+ win.setAttribute('width', '200');
94
+ await settle();
95
+
96
+ expect(win.dataset.breakpoint).toBe('max-width: 300px');
97
+ expect(win.currentBreakpoint).toBe(win.breakpoints[0]!);
98
+ win.remove();
99
+ });
100
+ });
101
+
102
+ await describe('adw-window dialog tracking', async () => {
103
+ await it('tracks open dialogs presented inside the window', async () => {
104
+ const win = makeWindow();
105
+ const dialog = document.createElement('adw-dialog') as HTMLElement & { present(): void };
106
+ dialog.innerHTML = '<p>Dialog content</p>';
107
+ win.appendChild(dialog);
108
+ dialog.present();
109
+ expect(win.dialogs.length).toBe(1);
110
+ expect(win.visibleDialog).toBe(dialog);
111
+ dialog.remove();
112
+ win.remove();
113
+ });
114
+
115
+ await it('stops tracking a dialog when it closes', async () => {
116
+ const win = makeWindow();
117
+ const dialog = document.createElement('adw-dialog') as HTMLElement & { present(): void; close(): void };
118
+ dialog.innerHTML = '<p>Dialog content</p>';
119
+ win.appendChild(dialog);
120
+ dialog.present();
121
+ expect(win.dialogs.length).toBe(1);
122
+ dialog.close();
123
+ expect(win.dialogs.length).toBe(0);
124
+ expect(win.visibleDialog).toBeNull();
125
+ dialog.remove();
126
+ win.remove();
127
+ });
128
+ });
129
+ };
@@ -16,31 +16,48 @@
16
16
  // Copyright (c) GNOME contributors (libadwaita). LGPLv2.1+.
17
17
 
18
18
  import { AdwBreakpoint } from '@gjsify/adwaita-core';
19
+ import type { BreakpointSize } from '@gjsify/adwaita-core';
19
20
 
20
21
  /**
21
- * Drive `breakpoints` from `element`'s own box, and return a dispose function.
22
+ * The SIZE SOURCE both adaptive shapes in this package share: a `ResizeObserver` on
23
+ * `element`, handing every delivery's BORDER box to `onSize`.
22
24
  *
23
- * `ResizeObserver` delivers an initial observation on `observe()`, so the breakpoints
24
- * settle on the correct state before first paint — no flash of the wrong layout, no
25
+ * Split out of {@link addBreakpoints} because a second consumer needs the box without
26
+ * the `AdwBreakpoint` state machine: `<adw-breakpoint-bin>` drives `BreakpointBinState`
27
+ * (core), which evaluates a LIST of breakpoints and answers with the writes to perform,
28
+ * so it cannot be handed one `AdwBreakpoint` per condition. Two readers of
29
+ * `borderBoxSize` would be two shapes of the fallback, and the fallback is the half that
30
+ * only matters on the engines that do not report `borderBoxSize` at all.
31
+ *
32
+ * `ResizeObserver` delivers an initial observation on `observe()`, so the caller
33
+ * settles on the correct state before first paint — no flash of the wrong layout, no
25
34
  * separate seeding pass. The size read is the BORDER box in CSS pixels, the browser's
26
35
  * counterpart to the `sp`/DIP units an Adwaita condition is written in.
27
36
  */
28
- export function addBreakpoints(element: Element, breakpoints: readonly AdwBreakpoint[]): () => void {
37
+ export function observeAdaptiveSize(element: Element, onSize: (size: BreakpointSize) => void): () => void {
29
38
  const observer = new ResizeObserver((entries) => {
30
39
  const entry = entries[entries.length - 1];
31
40
  if (!entry) return;
32
41
  // borderBoxSize is the spec'd path; contentRect is the fallback for the shape older
33
42
  // engines report.
34
43
  const box = entry.borderBoxSize?.[0];
35
- const size = box
36
- ? { width: box.inlineSize, height: box.blockSize }
37
- : { width: entry.contentRect.width, height: entry.contentRect.height };
38
- for (const breakpoint of breakpoints) breakpoint.evaluate(size);
44
+ onSize(
45
+ box
46
+ ? { width: box.inlineSize, height: box.blockSize }
47
+ : { width: entry.contentRect.width, height: entry.contentRect.height },
48
+ );
39
49
  });
40
50
  observer.observe(element);
41
51
  return () => observer.disconnect();
42
52
  }
43
53
 
54
+ /** Drive `breakpoints` from `element`'s own box, and return a dispose function. */
55
+ export function addBreakpoints(element: Element, breakpoints: readonly AdwBreakpoint[]): () => void {
56
+ return observeAdaptiveSize(element, (size) => {
57
+ for (const breakpoint of breakpoints) breakpoint.evaluate(size);
58
+ });
59
+ }
60
+
44
61
  /**
45
62
  * Wire a `breakpoint="<condition>"` attribute to a boolean setter, the browser equivalent
46
63
  * of an `Adw.Breakpoint` with one `add_setter()` call. Returns a dispose function; call it
@@ -0,0 +1,3 @@
1
+ import type { ConstructCapabilities } from '@gjsify/adwaita-core/conformance';
2
+
3
+ export const capabilities: ConstructCapabilities;
@@ -0,0 +1,18 @@
1
+ // Which template constructs `adwaita-web`'s tree builder builds (ADR 0093 § 2). Pure data, so a
2
+ // build plugin can read it without importing the renderer — and plain `.mjs`, because the
3
+ // plugin loads it under Node from a published package, where Node refuses to strip types.
4
+
5
+ /** @type {import('./capabilities.d.mts').capabilities} */
6
+ export const capabilities = {
7
+ layout: {
8
+ refused:
9
+ 'an <adw-…> element is placed by DOM order and slot=, so a layout-manager placement has no door in the markup this package reads (ADR 0092)',
10
+ },
11
+ strings: 'implemented',
12
+ responses: 'implemented',
13
+ page: 'implemented',
14
+ extern: 'implemented',
15
+ signal: 'implemented',
16
+ bind: 'implemented',
17
+ breakpoint: 'implemented',
18
+ };
@@ -38,6 +38,10 @@ import { exportedElementClasses } from './exported-elements.js';
38
38
  */
39
39
  const NON_RENDERING = new Set([
40
40
  'input',
41
+ // Not a void element, but the same shape for this driver: a `<textarea>` renders its own
42
+ // `value` and lays out no children, so a probe appended into one measures 0 forever.
43
+ // `<gtk-text-view>.textarea` is the handle, the way `<gtk-entry>.input` is.
44
+ 'textarea',
41
45
  'img',
42
46
  'br',
43
47
  'hr',
@@ -72,6 +76,14 @@ function reveal(el: HTMLElement): void {
72
76
  if (typeof dialog.present === 'function') dialog.present();
73
77
  // `<adw-expander-row>.contentSection` is merely COLLAPSED — it is the disclosure.
74
78
  if (el.localName === 'adw-expander-row') el.setAttribute('expanded', '');
79
+ // `<adw-application-window>.menubar` is merely EMPTY: GTK draws no menubar for an
80
+ // application that installed none, so the strip stays hidden until BOTH the flag and
81
+ // a model are there. Keyed by tag for the same reason the expander is — the pair is
82
+ // its own idea, and no other widget in this package has it.
83
+ if (el.localName === 'adw-application-window') {
84
+ el.setAttribute('show-menubar', '');
85
+ el.setAttribute('menu-model', '[{"label":"File","submenu":[{"label":"Quit"}]}]');
86
+ }
75
87
  }
76
88
 
77
89
  /**