@gjsify/adwaita-web 0.64.1 → 0.64.2-next.254

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 (335) hide show
  1. package/README.md +22 -88
  2. package/dist/adwaita-web.css +91 -12
  3. package/dist/adwaita-web.css.map +1 -1
  4. package/lib/types/accessible.d.ts +8 -0
  5. package/lib/types/application.d.ts +1 -1
  6. package/lib/types/child-slot.spec.d.ts +1 -0
  7. package/lib/types/compute-expand.d.ts +5 -0
  8. package/lib/types/compute-expand.spec.d.ts +1 -0
  9. package/lib/types/container-fill.spec.d.ts +1 -0
  10. package/lib/types/elements/adw-about-dialog.d.ts +28 -1
  11. package/lib/types/elements/adw-action-row.d.ts +2 -1
  12. package/lib/types/elements/adw-alert-dialog.d.ts +80 -19
  13. package/lib/types/elements/adw-avatar.d.ts +2 -1
  14. package/lib/types/elements/adw-banner.d.ts +2 -1
  15. package/lib/types/elements/adw-bin.d.ts +2 -1
  16. package/lib/types/elements/adw-bottom-sheet.d.ts +5 -4
  17. package/lib/types/elements/adw-breakpoint-bin.d.ts +2 -1
  18. package/lib/types/elements/adw-button-content.d.ts +2 -1
  19. package/lib/types/elements/adw-button-row.d.ts +2 -1
  20. package/lib/types/elements/adw-card.d.ts +2 -1
  21. package/lib/types/elements/adw-carousel.d.ts +20 -3
  22. package/lib/types/elements/adw-clamp-scrollable.d.ts +2 -1
  23. package/lib/types/elements/adw-clamp.d.ts +2 -1
  24. package/lib/types/elements/adw-combo-row.d.ts +6 -1
  25. package/lib/types/elements/adw-data-grid.d.ts +2 -1
  26. package/lib/types/elements/adw-dialog.d.ts +2 -1
  27. package/lib/types/elements/adw-entry-row.d.ts +2 -1
  28. package/lib/types/elements/adw-expander-row.d.ts +2 -1
  29. package/lib/types/elements/adw-header-bar.d.ts +2 -1
  30. package/lib/types/elements/adw-inline-view-switcher.d.ts +3 -2
  31. package/lib/types/elements/adw-layout-slot.d.ts +2 -1
  32. package/lib/types/elements/adw-multi-layout-view.d.ts +2 -1
  33. package/lib/types/elements/adw-navigation-split-view.d.ts +2 -1
  34. package/lib/types/elements/adw-navigation-view.d.ts +3 -2
  35. package/lib/types/elements/adw-overlay-split-view.d.ts +2 -1
  36. package/lib/types/elements/adw-preferences-dialog.d.ts +5 -4
  37. package/lib/types/elements/adw-preferences-group.d.ts +2 -1
  38. package/lib/types/elements/adw-preferences-row.d.ts +2 -1
  39. package/lib/types/elements/adw-shortcut-label.d.ts +2 -1
  40. package/lib/types/elements/adw-shortcuts-item.d.ts +2 -1
  41. package/lib/types/elements/adw-shortcuts-section.d.ts +2 -1
  42. package/lib/types/elements/adw-sidebar.d.ts +4 -3
  43. package/lib/types/elements/adw-spin-row.d.ts +2 -1
  44. package/lib/types/elements/adw-spinner.d.ts +2 -1
  45. package/lib/types/elements/adw-split-button.d.ts +2 -1
  46. package/lib/types/elements/adw-status-page.d.ts +2 -1
  47. package/lib/types/elements/adw-switch-row.d.ts +4 -1
  48. package/lib/types/elements/adw-tab-bar.d.ts +2 -1
  49. package/lib/types/elements/adw-tab-button.d.ts +2 -1
  50. package/lib/types/elements/adw-tab-overview.d.ts +2 -1
  51. package/lib/types/elements/adw-tab-view.d.ts +3 -2
  52. package/lib/types/elements/adw-toast-overlay.d.ts +10 -30
  53. package/lib/types/elements/adw-toggle-group.d.ts +3 -2
  54. package/lib/types/elements/adw-toolbar-view.d.ts +2 -1
  55. package/lib/types/elements/adw-view-stack.d.ts +3 -1
  56. package/lib/types/elements/adw-view-switcher-bar.d.ts +2 -1
  57. package/lib/types/elements/adw-view-switcher-sidebar.d.ts +2 -1
  58. package/lib/types/elements/adw-view-switcher.d.ts +3 -2
  59. package/lib/types/elements/adw-window-features.d.ts +8 -0
  60. package/lib/types/elements/adw-window-title.d.ts +2 -1
  61. package/lib/types/elements/adw-wrap-box.d.ts +2 -1
  62. package/lib/types/elements/checks.d.ts +16 -1
  63. package/lib/types/elements/gtk-action-bar.d.ts +2 -1
  64. package/lib/types/elements/gtk-application-window.d.ts +1 -4
  65. package/lib/types/elements/gtk-aspect-frame.d.ts +2 -1
  66. package/lib/types/elements/gtk-box.d.ts +5 -1
  67. package/lib/types/elements/gtk-button.d.ts +5 -7
  68. package/lib/types/elements/gtk-calendar.d.ts +2 -1
  69. package/lib/types/elements/gtk-center-box.d.ts +2 -1
  70. package/lib/types/elements/gtk-color-dialog-button.d.ts +2 -1
  71. package/lib/types/elements/gtk-drag-icon.d.ts +2 -1
  72. package/lib/types/elements/gtk-drawing-area.d.ts +2 -1
  73. package/lib/types/elements/gtk-drop-down.d.ts +2 -1
  74. package/lib/types/elements/gtk-editable-label.d.ts +2 -1
  75. package/lib/types/elements/gtk-emoji-chooser.d.ts +2 -0
  76. package/lib/types/elements/gtk-entry.d.ts +2 -1
  77. package/lib/types/elements/gtk-expander.d.ts +2 -1
  78. package/lib/types/elements/gtk-fixed.d.ts +2 -1
  79. package/lib/types/elements/gtk-flow-box-child.d.ts +2 -1
  80. package/lib/types/elements/gtk-flow-box.d.ts +2 -1
  81. package/lib/types/elements/gtk-font-dialog-button.d.ts +2 -1
  82. package/lib/types/elements/gtk-frame.d.ts +2 -1
  83. package/lib/types/elements/gtk-gl-area.d.ts +2 -1
  84. package/lib/types/elements/gtk-graphics-offload.d.ts +2 -1
  85. package/lib/types/elements/gtk-grid.d.ts +2 -1
  86. package/lib/types/elements/gtk-header-bar.d.ts +2 -1
  87. package/lib/types/elements/gtk-image.d.ts +5 -6
  88. package/lib/types/elements/gtk-inscription.d.ts +2 -1
  89. package/lib/types/elements/gtk-label.d.ts +10 -3
  90. package/lib/types/elements/gtk-level-bar.d.ts +2 -1
  91. package/lib/types/elements/gtk-list-box-row.d.ts +2 -1
  92. package/lib/types/elements/gtk-list-box.d.ts +2 -1
  93. package/lib/types/elements/gtk-list-view.d.ts +2 -1
  94. package/lib/types/elements/gtk-media-controls.d.ts +2 -1
  95. package/lib/types/elements/gtk-menu-button.d.ts +2 -1
  96. package/lib/types/elements/gtk-notebook.d.ts +2 -1
  97. package/lib/types/elements/gtk-overlay.d.ts +2 -1
  98. package/lib/types/elements/gtk-paned.d.ts +2 -1
  99. package/lib/types/elements/gtk-picture.d.ts +2 -1
  100. package/lib/types/elements/gtk-popover-bin.d.ts +2 -1
  101. package/lib/types/elements/gtk-popover-menu-bar.d.ts +2 -1
  102. package/lib/types/elements/gtk-popover-menu.d.ts +2 -0
  103. package/lib/types/elements/gtk-popover.d.ts +7 -1
  104. package/lib/types/elements/gtk-progress-bar.d.ts +2 -1
  105. package/lib/types/elements/gtk-revealer.d.ts +2 -1
  106. package/lib/types/elements/gtk-scale-button.d.ts +2 -1
  107. package/lib/types/elements/gtk-scale.d.ts +2 -1
  108. package/lib/types/elements/gtk-scrollbar.d.ts +2 -1
  109. package/lib/types/elements/gtk-scrolled-window.d.ts +2 -1
  110. package/lib/types/elements/gtk-search-bar.d.ts +2 -1
  111. package/lib/types/elements/gtk-separator.d.ts +2 -1
  112. package/lib/types/elements/gtk-spin-button.d.ts +2 -1
  113. package/lib/types/elements/gtk-spinner.d.ts +2 -1
  114. package/lib/types/elements/gtk-stack-page.d.ts +29 -0
  115. package/lib/types/elements/gtk-stack-sidebar.d.ts +2 -1
  116. package/lib/types/elements/gtk-stack-switcher.d.ts +2 -1
  117. package/lib/types/elements/gtk-stack.d.ts +13 -1
  118. package/lib/types/elements/gtk-switch.d.ts +2 -1
  119. package/lib/types/elements/gtk-text-view.d.ts +2 -1
  120. package/lib/types/elements/gtk-text.d.ts +2 -1
  121. package/lib/types/elements/gtk-tree-expander.d.ts +2 -1
  122. package/lib/types/elements/gtk-video.d.ts +2 -1
  123. package/lib/types/elements/gtk-viewport.d.ts +2 -1
  124. package/lib/types/elements/gtk-window-controls.d.ts +2 -1
  125. package/lib/types/elements/gtk-window-handle.d.ts +2 -1
  126. package/lib/types/elements/gtk-window.d.ts +18 -2
  127. package/lib/types/gobject-elements.d.ts +15 -0
  128. package/lib/types/gtksource/gtk-source-view.d.ts +2 -1
  129. package/lib/types/{icon-registry.spec.d.ts → icon-masks.spec.d.ts} +1 -1
  130. package/lib/types/icon-theme.d.ts +15 -35
  131. package/lib/types/index.d.ts +3 -4
  132. package/lib/types/learn6502-window.spec.d.ts +1 -0
  133. package/lib/types/namespace/adw.d.ts +1 -1
  134. package/lib/types/namespace/gdk.d.ts +1 -0
  135. package/lib/types/namespace/gio.d.ts +1 -0
  136. package/lib/types/namespace/glib.d.ts +2 -1
  137. package/lib/types/namespace/gtk.d.ts +2 -0
  138. package/lib/types/shared-tree-builder.d.ts +31 -0
  139. package/lib/types/signals.d.ts +5 -1
  140. package/lib/types/source-view/adw-source-view.d.ts +2 -1
  141. package/lib/types/styles.generated.d.ts +1 -1
  142. package/lib/types/widget-element.d.ts +25 -0
  143. package/lib/types/widget-map.spec.d.ts +1 -0
  144. package/lib/types/widget-mapping.d.ts +7 -0
  145. package/lib/types/widget-visible.spec.d.ts +1 -0
  146. package/lib/types/window-maximize.spec.d.ts +1 -0
  147. package/package.json +13 -12
  148. package/scss/_about_dialog.scss +46 -1
  149. package/scss/_bin.scss +6 -3
  150. package/scss/_checks.scss +5 -2
  151. package/scss/_icon.scss +3 -4
  152. package/scss/_labels.scss +2 -2
  153. package/scss/_overlay.scss +11 -1
  154. package/scss/_overlay_split_view.scss +10 -0
  155. package/scss/_reset.scss +1 -1
  156. package/scss/_scrolled_window.scss +15 -0
  157. package/scss/_stack.scss +8 -2
  158. package/scss/_toast.scss +13 -3
  159. package/scss/_widget.scss +5 -1
  160. package/scss/_window.scss +16 -0
  161. package/src/accessible.ts +29 -0
  162. package/src/adw-about-dialog.spec.ts +81 -12
  163. package/src/adw-action-rows.spec.ts +2 -2
  164. package/src/adw-alert-dialog.spec.ts +71 -5
  165. package/src/adw-bin.spec.ts +4 -3
  166. package/src/adw-button-content.spec.ts +1 -1
  167. package/src/adw-carousel.spec.ts +49 -1
  168. package/src/adw-header-bar.spec.ts +18 -0
  169. package/src/adw-toast-overlay.spec.ts +68 -24
  170. package/src/application.spec.ts +44 -0
  171. package/src/application.ts +13 -18
  172. package/src/capabilities.mjs +2 -3
  173. package/src/checks.spec.ts +51 -1
  174. package/src/child-slot.spec.ts +71 -0
  175. package/src/compute-expand.spec.ts +186 -0
  176. package/src/compute-expand.ts +134 -0
  177. package/src/construct-vectors.spec.ts +97 -7
  178. package/src/container-fill.spec.ts +70 -0
  179. package/src/elements/adw-about-dialog.ts +152 -9
  180. package/src/elements/adw-action-row.ts +2 -1
  181. package/src/elements/adw-alert-dialog.ts +177 -46
  182. package/src/elements/adw-application-window.ts +0 -3
  183. package/src/elements/adw-avatar.ts +2 -1
  184. package/src/elements/adw-banner.ts +2 -1
  185. package/src/elements/adw-bin.ts +2 -1
  186. package/src/elements/adw-bottom-sheet.ts +5 -4
  187. package/src/elements/adw-breakpoint-bin.ts +5 -1
  188. package/src/elements/adw-button-content.ts +2 -1
  189. package/src/elements/adw-button-row.ts +2 -1
  190. package/src/elements/adw-card.ts +2 -1
  191. package/src/elements/adw-carousel.ts +62 -3
  192. package/src/elements/adw-clamp-scrollable.ts +2 -1
  193. package/src/elements/adw-clamp.ts +2 -1
  194. package/src/elements/adw-combo-row.ts +15 -1
  195. package/src/elements/adw-data-grid.ts +2 -1
  196. package/src/elements/adw-dialog.ts +5 -2
  197. package/src/elements/adw-entry-row.ts +2 -1
  198. package/src/elements/adw-expander-row.ts +2 -1
  199. package/src/elements/adw-header-bar.ts +6 -1
  200. package/src/elements/adw-inline-view-switcher.ts +3 -2
  201. package/src/elements/adw-layout-slot.ts +2 -1
  202. package/src/elements/adw-multi-layout-view.ts +2 -1
  203. package/src/elements/adw-navigation-split-view.ts +2 -1
  204. package/src/elements/adw-navigation-view.ts +3 -2
  205. package/src/elements/adw-overlay-split-view.ts +2 -1
  206. package/src/elements/adw-preferences-dialog.ts +6 -4
  207. package/src/elements/adw-preferences-group.ts +2 -1
  208. package/src/elements/adw-preferences-row.ts +2 -1
  209. package/src/elements/adw-shortcut-label.ts +2 -1
  210. package/src/elements/adw-shortcuts-item.ts +2 -1
  211. package/src/elements/adw-shortcuts-section.ts +2 -1
  212. package/src/elements/adw-sidebar.ts +4 -3
  213. package/src/elements/adw-spin-row.ts +2 -1
  214. package/src/elements/adw-spinner.ts +2 -1
  215. package/src/elements/adw-split-button.ts +2 -1
  216. package/src/elements/adw-status-page.ts +2 -1
  217. package/src/elements/adw-switch-row.ts +10 -1
  218. package/src/elements/adw-tab-bar.ts +2 -1
  219. package/src/elements/adw-tab-button.ts +2 -1
  220. package/src/elements/adw-tab-overview.ts +2 -1
  221. package/src/elements/adw-tab-view.ts +3 -2
  222. package/src/elements/adw-toast-overlay.ts +37 -70
  223. package/src/elements/adw-toggle-group.ts +3 -2
  224. package/src/elements/adw-toolbar-view.ts +2 -1
  225. package/src/elements/adw-view-stack.ts +39 -1
  226. package/src/elements/adw-view-switcher-bar.ts +2 -1
  227. package/src/elements/adw-view-switcher-sidebar.ts +2 -1
  228. package/src/elements/adw-view-switcher.ts +3 -2
  229. package/src/elements/adw-window-features.ts +14 -2
  230. package/src/elements/adw-window-title.ts +2 -1
  231. package/src/elements/adw-wrap-box.ts +2 -1
  232. package/src/elements/checks.ts +85 -6
  233. package/src/elements/gtk-action-bar.ts +2 -1
  234. package/src/elements/gtk-application-window.ts +3 -8
  235. package/src/elements/gtk-aspect-frame.ts +2 -1
  236. package/src/elements/gtk-box.ts +56 -1
  237. package/src/elements/gtk-button.ts +10 -22
  238. package/src/elements/gtk-calendar.ts +2 -1
  239. package/src/elements/gtk-center-box.ts +2 -1
  240. package/src/elements/gtk-color-dialog-button.ts +2 -1
  241. package/src/elements/gtk-drag-icon.ts +6 -1
  242. package/src/elements/gtk-drawing-area.ts +2 -1
  243. package/src/elements/gtk-drop-down.ts +2 -1
  244. package/src/elements/gtk-editable-label.ts +2 -1
  245. package/src/elements/gtk-emoji-chooser.ts +5 -0
  246. package/src/elements/gtk-entry.ts +2 -1
  247. package/src/elements/gtk-expander.ts +2 -1
  248. package/src/elements/gtk-fixed.ts +2 -1
  249. package/src/elements/gtk-flow-box-child.ts +5 -2
  250. package/src/elements/gtk-flow-box.ts +2 -1
  251. package/src/elements/gtk-font-dialog-button.ts +2 -1
  252. package/src/elements/gtk-frame.ts +2 -1
  253. package/src/elements/gtk-gl-area.ts +2 -1
  254. package/src/elements/gtk-graphics-offload.ts +5 -2
  255. package/src/elements/gtk-grid.ts +2 -1
  256. package/src/elements/gtk-header-bar.ts +2 -1
  257. package/src/elements/gtk-image.ts +14 -15
  258. package/src/elements/gtk-inscription.ts +2 -1
  259. package/src/elements/gtk-label.ts +12 -5
  260. package/src/elements/gtk-level-bar.ts +2 -1
  261. package/src/elements/gtk-list-box-row.ts +5 -2
  262. package/src/elements/gtk-list-box.ts +2 -1
  263. package/src/elements/gtk-list-view.ts +2 -1
  264. package/src/elements/gtk-media-controls.ts +2 -1
  265. package/src/elements/gtk-menu-button.ts +2 -1
  266. package/src/elements/gtk-notebook.ts +2 -1
  267. package/src/elements/gtk-overlay.ts +7 -5
  268. package/src/elements/gtk-paned.ts +9 -2
  269. package/src/elements/gtk-picture.ts +2 -1
  270. package/src/elements/gtk-popover-bin.ts +5 -1
  271. package/src/elements/gtk-popover-menu-bar.ts +2 -1
  272. package/src/elements/gtk-popover-menu.ts +5 -0
  273. package/src/elements/gtk-popover.ts +14 -1
  274. package/src/elements/gtk-progress-bar.ts +2 -1
  275. package/src/elements/gtk-revealer.ts +2 -1
  276. package/src/elements/gtk-scale-button.ts +2 -1
  277. package/src/elements/gtk-scale.ts +2 -1
  278. package/src/elements/gtk-scrollbar.ts +2 -1
  279. package/src/elements/gtk-scrolled-window.ts +8 -5
  280. package/src/elements/gtk-search-bar.ts +7 -6
  281. package/src/elements/gtk-separator.ts +2 -1
  282. package/src/elements/gtk-spin-button.ts +2 -1
  283. package/src/elements/gtk-spinner.ts +2 -1
  284. package/src/elements/gtk-stack-page.ts +112 -0
  285. package/src/elements/gtk-stack-sidebar.ts +2 -1
  286. package/src/elements/gtk-stack-switcher.ts +2 -1
  287. package/src/elements/gtk-stack.ts +52 -6
  288. package/src/elements/gtk-switch.ts +2 -1
  289. package/src/elements/gtk-text-view.ts +2 -1
  290. package/src/elements/gtk-text.ts +2 -1
  291. package/src/elements/gtk-tree-expander.ts +5 -1
  292. package/src/elements/gtk-video.ts +2 -1
  293. package/src/elements/gtk-viewport.ts +6 -1
  294. package/src/elements/gtk-window-controls.ts +2 -1
  295. package/src/elements/gtk-window-handle.ts +6 -1
  296. package/src/elements/gtk-window.ts +57 -7
  297. package/src/gio.spec.ts +13 -3
  298. package/src/glib.spec.ts +9 -0
  299. package/src/gobject-elements.ts +44 -2
  300. package/src/gtk-label.spec.ts +39 -0
  301. package/src/gtk-scrolled-window.spec.ts +6 -6
  302. package/src/gtk-stack.spec.ts +170 -0
  303. package/src/gtk-value-doors.spec.ts +19 -0
  304. package/src/gtk-window.spec.ts +2 -2
  305. package/src/gtksource/gtk-source-view.ts +2 -1
  306. package/src/{icon-registry.spec.ts → icon-masks.spec.ts} +4 -100
  307. package/src/icon-theme.spec.ts +69 -124
  308. package/src/icon-theme.ts +29 -119
  309. package/src/index.ts +5 -9
  310. package/src/keyboard-operable.spec.ts +3 -3
  311. package/src/learn6502-window.spec.ts +113 -0
  312. package/src/namespace/adw.ts +1 -1
  313. package/src/namespace/gdk.ts +1 -0
  314. package/src/namespace/gio.ts +8 -0
  315. package/src/namespace/glib.ts +4 -0
  316. package/src/namespace/gtk.ts +2 -0
  317. package/src/shared-tree-builder.ts +131 -13
  318. package/src/shared-trees.spec.ts +15 -1
  319. package/src/signals.ts +11 -2
  320. package/src/slotted-children.spec.ts +24 -0
  321. package/src/slotted-children.ts +18 -2
  322. package/src/source-view/adw-source-view.ts +2 -1
  323. package/src/split-button.spec.ts +1 -1
  324. package/src/style-manager.spec.ts +13 -0
  325. package/src/style-manager.ts +6 -0
  326. package/src/styles.generated.ts +1 -1
  327. package/src/test.browser.mts +16 -2
  328. package/src/value-lists.spec.ts +3 -3
  329. package/src/widget-element.ts +75 -0
  330. package/src/widget-map.spec.ts +116 -0
  331. package/src/widget-mapping.ts +100 -0
  332. package/src/widget-visible.spec.ts +148 -0
  333. package/src/window-maximize.spec.ts +93 -0
  334. package/lib/types/icon-registry.d.ts +0 -37
  335. package/src/icon-registry.ts +0 -163
@@ -28,6 +28,7 @@ import { AdwMultiLayoutViewTest } from './adw-multi-layout-view.spec.js';
28
28
  import { AdwDataGridTest } from './adw-data-grid.spec.js';
29
29
  import { GtkSourceViewTest } from './gtksource/gtk-source-view.spec.js';
30
30
  import { AdwDialogTest } from './adw-dialog.spec.js';
31
+ import { WidgetMapTest } from './widget-map.spec.js';
31
32
  import { AdwWindowTest } from './adw-window.spec.js';
32
33
  import { AdwShortcutsTest } from './adw-shortcuts.spec.js';
33
34
  import { AdwApplicationWindowTest } from './adw-application-window.spec.js';
@@ -65,7 +66,7 @@ import { PangoMarkupTest } from './pango-markup.spec.js';
65
66
  import { CopyGlyphTest } from './source-view/copy-glyph.spec.js';
66
67
  import { AdwButtonContentTest } from './adw-button-content.spec.js';
67
68
  import { GtkImageTest } from './gtk-image.spec.js';
68
- import { AdwIconRegistryTest } from './icon-registry.spec.js';
69
+ import { AdwIconMasksTest } from './icon-masks.spec.js';
69
70
  import { AdwIconThemeTest } from './icon-theme.spec.js';
70
71
  import { GioResourceTest } from './gio-resource.spec.js';
71
72
  import { GtkSwitchTest } from './gtk-switch.spec.js';
@@ -83,6 +84,7 @@ import { GtkListViewTest } from './gtk-list-view.spec.js';
83
84
  import { GtkHeaderBarTest } from './gtk-header-bar.spec.js';
84
85
  import { GtkWindowControlsTest } from './gtk-window-controls.spec.js';
85
86
  import { GtkWindowTest } from './gtk-window.spec.js';
87
+ import { WindowMaximizeTest } from './window-maximize.spec.js';
86
88
  import { GtkApplicationWindowTest } from './gtk-application-window.spec.js';
87
89
  import { GtkActionBarTest } from './gtk-action-bar.spec.js';
88
90
  import { GtkSeparatorTest } from './gtk-separator.spec.js';
@@ -93,6 +95,8 @@ import { GtkTreeExpanderTest } from './gtk-tree-expander.spec.js';
93
95
  import { GtkToggleButtonTest } from './gtk-toggle-button.spec.js';
94
96
  import { GtkExpanderTest } from './gtk-expander.spec.js';
95
97
  import { GtkOverlayTest } from './gtk-overlay.spec.js';
98
+ import { ContainerFillTest } from './container-fill.spec.js';
99
+ import { ComputeExpandTest } from './compute-expand.spec.js';
96
100
  import { GtkPanedTest } from './gtk-paned.spec.js';
97
101
  import { GtkRevealerTest } from './gtk-revealer.spec.js';
98
102
  import { GtkScaleTest } from './gtk-scale.spec.js';
@@ -161,6 +165,9 @@ import { AdwValueListsTest } from './value-lists.spec.js';
161
165
  import { AdwBlueprintLayoutTest } from './blueprint-layout.spec.js';
162
166
  import { AdwWidgetSizeTest } from './widget-size.spec.js';
163
167
  import { AdwSharedTreeMountTest } from './shared-tree-mount.spec.js';
168
+ import { AdwWidgetVisibleTest } from './widget-visible.spec.js';
169
+ import { AdwChildSlotTest } from './child-slot.spec.js';
170
+ import { AdwLearn6502WindowTest } from './learn6502-window.spec.js';
164
171
  import { AdwBlueprintMarkupTest } from './blueprint-markup.spec.js';
165
172
  import { AdwTagsTest } from './tags.spec.js';
166
173
  import { AdwFontStackTest } from './font-stack.spec.js';
@@ -183,6 +190,9 @@ run({
183
190
  AdwBlueprintLayoutTest,
184
191
  AdwWidgetSizeTest,
185
192
  AdwSharedTreeMountTest,
193
+ AdwWidgetVisibleTest,
194
+ AdwChildSlotTest,
195
+ AdwLearn6502WindowTest,
186
196
  AdwBlueprintMarkupTest,
187
197
  AdwTagsTest,
188
198
  AdwKeyboardOperableTest,
@@ -201,7 +211,7 @@ run({
201
211
  CopyGlyphTest,
202
212
  AdwButtonContentTest,
203
213
  GtkImageTest,
204
- AdwIconRegistryTest,
214
+ AdwIconMasksTest,
205
215
  AdwIconThemeTest,
206
216
  GioResourceTest,
207
217
  GtkSwitchTest,
@@ -219,6 +229,7 @@ run({
219
229
  GtkHeaderBarTest,
220
230
  GtkWindowControlsTest,
221
231
  GtkWindowTest,
232
+ WindowMaximizeTest,
222
233
  GtkApplicationWindowTest,
223
234
  GtkActionBarTest,
224
235
  GtkSeparatorTest,
@@ -234,6 +245,8 @@ run({
234
245
  GtkToggleButtonTest,
235
246
  GtkExpanderTest,
236
247
  GtkOverlayTest,
248
+ ContainerFillTest,
249
+ ComputeExpandTest,
237
250
  GtkPanedTest,
238
251
  GtkRevealerTest,
239
252
  GtkScaleTest,
@@ -287,6 +300,7 @@ run({
287
300
  AdwDataGridTest,
288
301
  GtkSourceViewTest,
289
302
  AdwDialogTest,
303
+ WidgetMapTest,
290
304
  AdwWindowTest,
291
305
  AdwShortcutsTest,
292
306
  AdwApplicationWindowTest,
@@ -63,9 +63,9 @@ export const AdwValueListsTest = async () => {
63
63
  const dialog = root as unknown as AdwAlertDialog;
64
64
  const read = vector.responses.map(({ id }) => ({
65
65
  id,
66
- label: dialog.getResponseLabel(id),
67
- appearance: dialog.getResponseAppearance(id),
68
- enabled: dialog.getResponseEnabled(id),
66
+ label: dialog.get_response_label(id),
67
+ appearance: dialog.get_response_appearance(id),
68
+ enabled: dialog.get_response_enabled(id),
69
69
  }));
70
70
  expect(JSON.stringify(read)).toBe(JSON.stringify(vector.responses));
71
71
  // The buttons the dialog paints, in the order the source wrote them.
@@ -0,0 +1,75 @@
1
+ // `Gtk.Widget`'s `visible` and `tooltip-text` on the element classes, once, so the types of every
2
+ // widget carry them and so does a plain `document.createElement()`, not only a built tree.
3
+ //
4
+ // `WidgetElement` is `HTMLElement` plus `gtk_widget_get_visible` / `gtk_widget_set_visible` over
5
+ // the DOM's `hidden` attribute, TRUE until hidden as GtkWidget's default is, and the `map` /
6
+ // `unmap` signals with `gtk_widget_get_mapped` (`widget-mapping.ts`); `installVisible`
7
+ // (`gobject-elements.ts`) gives the same to a class that does not extend it. It notifies only
8
+ // where the element declares `notify::visible`. A subclass with its own `visible`
9
+ // (`<gtk-stack-page>`, `<adw-sidebar>`) keeps its own.
10
+ //
11
+ // `TooltipElement` adds `Gtk.Widget:tooltip-text` for the elements that render the
12
+ // `tooltip-text` attribute: a button, and the rows (`row-tooltip.ts`). It reflects that attribute
13
+ // and the element's `attributeChangedCallback` draws it, so a widget that does not draw it does
14
+ // not extend this class.
15
+ //
16
+ // Reference: GTK gtk/gtkwidget.c (gtk_widget_set_visible, gtk_widget_set_tooltip_text)
17
+ // Copyright (c) GNOME contributors (GTK). LGPLv2.1+.
18
+
19
+ import { WIDGET_VISIBLE_GETTERS, notifyElement } from './gobject-elements.js';
20
+ import { dispatchedSignalsOf, type DispatchedSignals } from './signals.js';
21
+ import { isMapped } from './widget-mapping.js';
22
+
23
+ export class WidgetElement extends HTMLElement {
24
+ /** `Gtk.Widget::map` / `::unmap`, which every subclass inherits (`dispatchedSignalsOf`). */
25
+ static readonly signals: DispatchedSignals = { map: 'map', unmap: 'unmap' };
26
+
27
+ /** `Gtk.Widget:visible`. */
28
+ get visible(): boolean {
29
+ return !this.hidden;
30
+ }
31
+ set visible(value: boolean) {
32
+ const before = !this.hidden;
33
+ this.toggleAttribute('hidden', !value);
34
+ if (!this.hidden !== before && 'notify::visible' in dispatchedSignalsOf(this)) notifyElement(this, 'visible');
35
+ }
36
+ /** `gtk_widget_get_visible`. */
37
+ get_visible(): boolean {
38
+ return this.visible;
39
+ }
40
+ /** `gtk_widget_set_visible`. */
41
+ set_visible(visible: boolean): void {
42
+ this.visible = visible;
43
+ }
44
+ /** `gtk_widget_get_mapped`: on screen, which is in the document and rendered. */
45
+ get_mapped(): boolean {
46
+ return isMapped(this);
47
+ }
48
+ }
49
+
50
+ WIDGET_VISIBLE_GETTERS.add(Object.getOwnPropertyDescriptor(WidgetElement.prototype, 'visible')!.get!);
51
+
52
+ export class TooltipElement extends WidgetElement {
53
+ /** `Gtk.Widget:tooltip-text`, the `tooltip-text` attribute; `null` while unset. */
54
+ get tooltip_text(): string | null {
55
+ return this.getAttribute('tooltip-text');
56
+ }
57
+ set tooltip_text(value: string | null) {
58
+ if (value === null || value === undefined) this.removeAttribute('tooltip-text');
59
+ else this.setAttribute('tooltip-text', value);
60
+ }
61
+ get tooltipText(): string | null {
62
+ return this.tooltip_text;
63
+ }
64
+ set tooltipText(value: string | null) {
65
+ this.tooltip_text = value;
66
+ }
67
+ /** `gtk_widget_get_tooltip_text`. */
68
+ get_tooltip_text(): string | null {
69
+ return this.tooltip_text;
70
+ }
71
+ /** `gtk_widget_set_tooltip_text`. */
72
+ set_tooltip_text(text: string | null): void {
73
+ this.tooltip_text = text;
74
+ }
75
+ }
@@ -0,0 +1,116 @@
1
+ // `Gtk.Widget::map` / `::unmap` and `get_mapped()` on an element: WIDGET_MAP_VECTORS, plus the
2
+ // program that found the gap — a registered `Adw.PreferencesDialog` subclass connecting `map` in
3
+ // its constructor (Learn6502's preferences dialog), which threw "declares no signal 'map'".
4
+ import { describe, expect, it } from '@gjsify/unit';
5
+ import { driveWidgetMapVectors, WIDGET_MAP_VECTORS, type WidgetMapSubject } from '@gjsify/adwaita-core/conformance';
6
+
7
+ import { Adw, GObject } from './index.js';
8
+ import { installElementApi } from './gobject-elements.js';
9
+ import type { WidgetElement } from './widget-element.js';
10
+
11
+ type Connectable = HTMLElement & { connect(signal: string, handler: (...args: unknown[]) => unknown): number };
12
+
13
+ function settle(): Promise<void> {
14
+ return new Promise((resolve) => setTimeout(resolve));
15
+ }
16
+
17
+ const hosts: HTMLElement[] = [];
18
+
19
+ const subject: WidgetMapSubject = {
20
+ name: 'adwaita-web',
21
+ isOracle: false,
22
+ box() {
23
+ const el = document.createElement('gtk-box');
24
+ installElementApi(el);
25
+ return el;
26
+ },
27
+ append: (parent, child) => void (parent as HTMLElement).append(child as HTMLElement),
28
+ remove: (_parent, child) => void (child as HTMLElement).remove(),
29
+ present(widget) {
30
+ const host = document.createElement('div');
31
+ host.append(widget as HTMLElement);
32
+ document.body.append(host);
33
+ hosts.push(host);
34
+ },
35
+ setVisible: (widget, visible) => void ((widget as WidgetElement).visible = visible),
36
+ connect: (widget, signal, handler) => (widget as Connectable).connect(signal, handler),
37
+ isMapped: (widget) => (widget as WidgetElement).get_mapped(),
38
+ settle,
39
+ dispose() {
40
+ for (const host of hosts.splice(0)) host.remove();
41
+ },
42
+ };
43
+
44
+ class GoWebMapDialog extends Adw.PreferencesDialog {
45
+ log: string[] = [];
46
+ constructor(params?: Record<string, unknown>) {
47
+ // @ts-expect-error the element's own constructor takes none; the registered class's takes the params
48
+ super(params);
49
+ const self = this as unknown as Connectable & { get_mapped(): boolean };
50
+ self.connect('map', () => this.log.push(`map:${self.get_mapped()}`));
51
+ self.connect('unmap', () => this.log.push(`unmap:${self.get_mapped()}`));
52
+ }
53
+ }
54
+ GObject.registerClass({ GTypeName: 'GoWebMapDialog' }, GoWebMapDialog);
55
+
56
+ export const WidgetMapTest = async () => {
57
+ await driveWidgetMapVectors(subject, { describe, it, expect }, WIDGET_MAP_VECTORS);
58
+
59
+ await describe('adwaita-web: map / unmap on an element', async () => {
60
+ await it('every widget declares both, a subclass with its own signals too', () => {
61
+ for (const tag of ['gtk-box', 'gtk-button', 'adw-preferences-dialog']) {
62
+ const el = document.createElement(tag);
63
+ installElementApi(el);
64
+ expect(() => (el as Connectable).connect('map', () => {})).not.toThrow();
65
+ expect(() => (el as Connectable).connect('unmap', () => {})).not.toThrow();
66
+ }
67
+ // `<gtk-button>` declares `clicked` itself and still has `map`.
68
+ const button = document.createElement('gtk-button');
69
+ installElementApi(button);
70
+ expect(() => (button as Connectable).connect('clicked', () => {})).not.toThrow();
71
+ });
72
+
73
+ await it('a registered dialog connecting `map` in its constructor maps on present() and unmaps on close()', async () => {
74
+ const dialog = new (GoWebMapDialog as unknown as new () => GoWebMapDialog)();
75
+ await settle();
76
+ expect(dialog.log).toStrictEqual([]);
77
+ (dialog as unknown as { present(): void }).present();
78
+ await settle();
79
+ expect(dialog.log).toStrictEqual(['map:true']);
80
+ (dialog as unknown as { close(): void }).close();
81
+ await settle();
82
+ expect(dialog.log).toStrictEqual(['map:true', 'unmap:false']);
83
+ dialog.remove();
84
+ });
85
+
86
+ await it('a disconnected handler stops the watch: no emission after it', async () => {
87
+ const box = subject.box() as Connectable & { disconnect(id: number): void };
88
+ let emitted = 0;
89
+ const id = box.connect('map', () => void emitted++);
90
+ box.disconnect(id);
91
+ subject.present(box);
92
+ await settle();
93
+ expect(emitted).toBe(0);
94
+ subject.dispose();
95
+ });
96
+
97
+ await it('a popover that opens maps, one that closes unmaps', async () => {
98
+ const host = document.createElement('div');
99
+ const popover = document.createElement('div');
100
+ popover.setAttribute('popover', '');
101
+ const inner = subject.box() as Connectable;
102
+ popover.append(inner);
103
+ host.append(popover);
104
+ document.body.append(host);
105
+ const log: string[] = [];
106
+ inner.connect('map', () => void log.push('map'));
107
+ inner.connect('unmap', () => void log.push('unmap'));
108
+ popover.showPopover();
109
+ await settle();
110
+ popover.hidePopover();
111
+ await settle();
112
+ host.remove();
113
+ expect(log).toStrictEqual(['map', 'unmap']);
114
+ });
115
+ });
116
+ };
@@ -0,0 +1,100 @@
1
+ // `Gtk.Widget`'s `map` / `unmap` signals and `gtk_widget_get_mapped` on an element.
2
+ //
3
+ // A widget is mapped while it is on screen: it is visible and so is every ancestor. Here that is
4
+ // an element in the document that renders (`isConnected && checkVisibility()`), which covers a
5
+ // `hidden` ancestor, a closed `<dialog>`, an inactive stack page and a popover that is not open.
6
+ // `map` fires on the transition into that state and `unmap` on the way out, never on connect.
7
+ //
8
+ // The DOM has no event for either transition, so an element is only WATCHED while something
9
+ // listens to one of the two: one `MutationObserver` on the document (children and attributes,
10
+ // the whole subtree) and a capturing `toggle` listener (a popover opening changes no attribute)
11
+ // re-check every watched element after each batch. A batch is delivered after the change, not
12
+ // inside it as `gtk_widget_show` delivers it; a hide undone within the same turn emits nothing.
13
+ //
14
+ // Order is GTK's post-order (`map` and `unmap` are RUN_FIRST, and the class handler maps or
15
+ // unmaps the children first): the deepest element of a batch emits first, unmaps before maps.
16
+ //
17
+ // Reference: GTK gtk/gtkwidget.c (gtk_widget_map, gtk_widget_unmap, gtk_widget_real_map,
18
+ // gtk_widget_real_unmap, gtk_widget_get_mapped)
19
+ // Copyright (c) GNOME contributors (GTK). LGPLv2.1+.
20
+
21
+ /** Watched elements and the state each last emitted for. */
22
+ const STATE = new WeakMap<HTMLElement, { mapped: boolean; listeners: number }>();
23
+ const WATCHED = new Set<WeakRef<HTMLElement>>();
24
+ const REFS = new WeakMap<HTMLElement, WeakRef<HTMLElement>>();
25
+ let observer: MutationObserver | null = null;
26
+
27
+ /** `gtk_widget_get_mapped`: in the document, and rendered. */
28
+ export function isMapped(el: Element): boolean {
29
+ return el.isConnected && el.checkVisibility();
30
+ }
31
+
32
+ function depthOf(el: Element): number {
33
+ let depth = 0;
34
+ for (let at = el.parentElement; at !== null; at = at.parentElement) depth++;
35
+ return depth;
36
+ }
37
+
38
+ function recheck(): void {
39
+ const changed: HTMLElement[] = [];
40
+ for (const ref of WATCHED) {
41
+ const el = ref.deref();
42
+ if (el === undefined) {
43
+ WATCHED.delete(ref);
44
+ continue;
45
+ }
46
+ const state = STATE.get(el)!;
47
+ if (isMapped(el) !== state.mapped) changed.push(el);
48
+ }
49
+ if (changed.length === 0) return;
50
+ const deepestFirst = (list: HTMLElement[]) =>
51
+ list.map((el) => [el, depthOf(el)] as const).sort((a, b) => b[1] - a[1]);
52
+ const unmapped = deepestFirst(changed.filter((el) => STATE.get(el)!.mapped));
53
+ const mapped = deepestFirst(changed.filter((el) => !STATE.get(el)!.mapped));
54
+ for (const [el] of [...unmapped, ...mapped]) {
55
+ const state = STATE.get(el)!;
56
+ state.mapped = !state.mapped;
57
+ el.dispatchEvent(new CustomEvent(state.mapped ? 'map' : 'unmap'));
58
+ }
59
+ }
60
+
61
+ function observe(): void {
62
+ if (observer !== null) return;
63
+ observer = new MutationObserver(recheck);
64
+ observer.observe(document, { childList: true, subtree: true, attributes: true });
65
+ document.addEventListener('toggle', recheck, true);
66
+ }
67
+
68
+ function unobserve(): void {
69
+ if (observer === null || WATCHED.size > 0) return;
70
+ observer.disconnect();
71
+ observer = null;
72
+ document.removeEventListener('toggle', recheck, true);
73
+ }
74
+
75
+ /**
76
+ * Watches `el` for `map` / `unmap` while the returned function has not been called. Its present
77
+ * state is recorded and not emitted, as connecting a handler in GTK emits nothing.
78
+ */
79
+ export function watchMapping(el: HTMLElement): () => void {
80
+ let state = STATE.get(el);
81
+ if (state === undefined || state.listeners === 0) {
82
+ state = { mapped: isMapped(el), listeners: 0 };
83
+ STATE.set(el, state);
84
+ const ref = new WeakRef(el);
85
+ REFS.set(el, ref);
86
+ WATCHED.add(ref);
87
+ observe();
88
+ }
89
+ state.listeners++;
90
+ let watching = true;
91
+ return () => {
92
+ if (!watching) return;
93
+ watching = false;
94
+ const current = STATE.get(el)!;
95
+ if (--current.listeners > 0) return;
96
+ WATCHED.delete(REFS.get(el)!);
97
+ REFS.delete(el);
98
+ unobserve();
99
+ };
100
+ }
@@ -0,0 +1,148 @@
1
+ // `Gtk.Widget:visible` on a built element: an authored `visible: false`, `get_visible()` /
2
+ // `set_visible()`, the property, and a breakpoint setter that writes it and restores it.
3
+ import { describe, expect, it } from '@gjsify/unit';
4
+ import type { SharedTreeNode } from '@gjsify/adwaita-core/conformance';
5
+
6
+ import { Adw, Gtk } from './index.js';
7
+
8
+ import { mountSharedTree } from './shared-tree-builder.js';
9
+
10
+ function settle(): Promise<void> {
11
+ return new Promise((resolve) => {
12
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
13
+ });
14
+ }
15
+
16
+ type Widget = HTMLElement & { visible: boolean; get_visible(): boolean; set_visible(value: boolean): void };
17
+
18
+ const tree = (width: number, authored: boolean): SharedTreeNode => ({
19
+ tag: 'AdwApplicationWindow',
20
+ props: { 'default-width': width, 'default-height': 400 },
21
+ breakpoints: [
22
+ {
23
+ condition: 'max-width: 599sp',
24
+ setters: [{ object: 'target', property: 'visible', value: false }],
25
+ },
26
+ ],
27
+ children: [
28
+ {
29
+ tag: 'GtkBox',
30
+ slot: 'content',
31
+ children: [{ tag: 'GtkButton', id: 'target', props: authored ? {} : { visible: false } }],
32
+ },
33
+ ],
34
+ });
35
+
36
+ export const AdwWidgetVisibleTest = async () => {
37
+ await describe('adwaita-web: Gtk.Widget:visible on a built element', async () => {
38
+ await it('an authored `visible: false` hides the widget', () => {
39
+ const { root, unmount } = mountSharedTree({
40
+ tag: 'GtkBox',
41
+ children: [{ tag: 'GtkButton', id: 'b', props: { visible: false } }],
42
+ });
43
+ const button = root.querySelector('#b') as Widget;
44
+ expect(button.hidden).toBe(true);
45
+ expect(button.visible).toBe(false);
46
+ expect(button.get_visible()).toBe(false);
47
+ unmount();
48
+ });
49
+
50
+ await it('is visible by default, and an authored `true` shows it', () => {
51
+ const { root, unmount } = mountSharedTree({
52
+ tag: 'GtkBox',
53
+ children: [
54
+ { tag: 'GtkButton', id: 'a' },
55
+ { tag: 'GtkButton', id: 'b', props: { visible: true } },
56
+ ],
57
+ });
58
+ expect((root.querySelector('#a') as Widget).get_visible()).toBe(true);
59
+ expect((root.querySelector('#b') as Widget).hidden).toBe(false);
60
+ unmount();
61
+ });
62
+
63
+ await it('set_visible() and the property round-trip', () => {
64
+ const { root, unmount } = mountSharedTree({
65
+ tag: 'GtkBox',
66
+ children: [{ tag: 'GtkButton', id: 'b' }],
67
+ });
68
+ const button = root.querySelector('#b') as Widget;
69
+ button.set_visible(false);
70
+ expect(button.hidden).toBe(true);
71
+ button.visible = true;
72
+ expect(button.hidden).toBe(false);
73
+ expect(button.get_visible()).toBe(true);
74
+ unmount();
75
+ });
76
+
77
+ await it('a breakpoint setter hides the widget and unapplying restores it', async () => {
78
+ const narrow = mountSharedTree(tree(400, true));
79
+ await settle();
80
+ expect((narrow.root.querySelector('#target') as Widget).visible).toBe(false);
81
+ narrow.unmount();
82
+
83
+ const wide = mountSharedTree(tree(1000, true));
84
+ await settle();
85
+ expect((wide.root.querySelector('#target') as Widget).visible).toBe(true);
86
+ wide.unmount();
87
+ });
88
+
89
+ await it('unapplying a breakpoint restores an authored `false`', async () => {
90
+ const { root, unmount } = mountSharedTree(tree(1000, false));
91
+ await settle();
92
+ expect((root.querySelector('#target') as Widget).visible).toBe(false);
93
+ unmount();
94
+ });
95
+
96
+ await it('<gtk-stack-page> and <adw-sidebar> keep their own `visible`', () => {
97
+ const page = document.createElement('gtk-stack-page') as Widget;
98
+ page.visible = false;
99
+ expect(page.hasAttribute('hidden')).toBe(true);
100
+ const item = document.createElement('adw-sidebar-item') as Widget;
101
+ item.visible = false;
102
+ expect(item.getAttribute('visible')).toBe('false');
103
+ expect(item.hasAttribute('hidden')).toBe(true);
104
+ });
105
+ });
106
+
107
+ await describe('adwaita-web: Gtk.Widget:visible and tooltip-text on the element class', async () => {
108
+ await it('a created button has visible, get_visible and set_visible, typed on the class', () => {
109
+ const button: Gtk.Button = new Gtk.Button();
110
+ expect(button.visible).toBe(true);
111
+ button.set_visible(false);
112
+ expect(button.hidden).toBe(true);
113
+ expect(button.get_visible()).toBe(false);
114
+ button.visible = true;
115
+ expect(button.hasAttribute('hidden')).toBe(false);
116
+ });
117
+
118
+ await it('a created widget that is not a button has them too', () => {
119
+ const box = new Gtk.Box();
120
+ box.visible = false;
121
+ expect(box.hidden).toBe(true);
122
+ expect(box.get_visible()).toBe(false);
123
+ });
124
+
125
+ await it('a button has tooltip_text, tooltipText and get/set_tooltip_text over one attribute', () => {
126
+ const button = new Gtk.Button();
127
+ document.body.append(button);
128
+ expect(button.get_tooltip_text()).toBe(null);
129
+ button.set_tooltip_text('Copy');
130
+ expect(button.tooltip_text).toBe('Copy');
131
+ expect(button.tooltipText).toBe('Copy');
132
+ expect(button.getAttribute('tooltip-text')).toBe('Copy');
133
+ expect(button.querySelector('button')?.title).toBe('Copy');
134
+ button.tooltip_text = null;
135
+ expect(button.hasAttribute('tooltip-text')).toBe(false);
136
+ button.remove();
137
+ });
138
+
139
+ await it('a row has them and draws the tooltip on its parts', () => {
140
+ const row: Adw.ActionRow = new Adw.ActionRow();
141
+ document.body.append(row);
142
+ row.set_tooltip_text('Hint');
143
+ expect(row.get_tooltip_text()).toBe('Hint');
144
+ expect(row.querySelector('[title="Hint"]') !== null).toBe(true);
145
+ row.remove();
146
+ });
147
+ });
148
+ };
@@ -0,0 +1,93 @@
1
+ // A maximized or fullscreen `Gtk.Window` ignores its default size and fills the work area
2
+ // (gtkwindow.c); on a page that is the frame's containing block. Driven through layout, because
3
+ // the claim is about the box, not about a class name. One body for the three window elements.
4
+ import { describe, expect, it } from '@gjsify/unit';
5
+
6
+ import type { GtkWindow } from './elements/gtk-window.js';
7
+
8
+ const TAGS = ['gtk-window', 'adw-window', 'adw-application-window'] as const;
9
+
10
+ function mount(tag: string, attrs: Record<string, string> = {}): { el: GtkWindow; host: HTMLElement } {
11
+ const host = document.createElement('div');
12
+ host.style.cssText = 'position:relative;width:500px;height:400px';
13
+ document.body.appendChild(host);
14
+ const el = document.createElement(tag) as GtkWindow;
15
+ el.setAttribute('default-width', '360');
16
+ el.setAttribute('default-height', '240');
17
+ for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
18
+ host.appendChild(el);
19
+ return { el, host };
20
+ }
21
+
22
+ function size(el: HTMLElement): string {
23
+ const rect = el.getBoundingClientRect();
24
+ return `${Math.round(rect.width)}x${Math.round(rect.height)}`;
25
+ }
26
+
27
+ export const WindowMaximizeTest = async () => {
28
+ for (const tag of TAGS) {
29
+ await describe(`<${tag}> maximized fills its containing block`, async () => {
30
+ await it('opens at the default size, fills the box maximized, and restores on unmaximize', async () => {
31
+ const { el, host } = mount(tag);
32
+ expect(size(el)).toBe('360x240');
33
+ el.maximize();
34
+ expect(size(el)).toBe('500x400');
35
+ expect(el.style.width).toBe('');
36
+ el.unmaximize();
37
+ expect(size(el)).toBe('360x240');
38
+ host.remove();
39
+ });
40
+
41
+ await it('fills the box through the `maximized` property and `toggle-maximized`', async () => {
42
+ const { el, host } = mount(tag);
43
+ el.maximized = true;
44
+ expect(size(el)).toBe('500x400');
45
+ el.maximized = false;
46
+ expect(size(el)).toBe('360x240');
47
+ el.dispatchEvent(new CustomEvent('window-action', { detail: { action: 'toggle-maximized' } }));
48
+ expect(size(el)).toBe('500x400');
49
+ el.dispatchEvent(new CustomEvent('window-action', { detail: { action: 'toggle-maximized' } }));
50
+ expect(size(el)).toBe('360x240');
51
+ host.remove();
52
+ });
53
+
54
+ await it('fills the box fullscreened and restores on unfullscreen', async () => {
55
+ const { el, host } = mount(tag);
56
+ el.fullscreen();
57
+ expect(el.is_fullscreen()).toBe(true);
58
+ expect(size(el)).toBe('500x400');
59
+ el.unfullscreen();
60
+ expect(size(el)).toBe('360x240');
61
+ host.remove();
62
+ });
63
+
64
+ await it('stays filled until both states are gone', async () => {
65
+ const { el, host } = mount(tag);
66
+ el.maximize();
67
+ el.fullscreen();
68
+ el.unmaximize();
69
+ expect(size(el)).toBe('500x400');
70
+ el.unfullscreen();
71
+ expect(size(el)).toBe('360x240');
72
+ host.remove();
73
+ });
74
+
75
+ await it('fills the box already maximized when it is connected', async () => {
76
+ const { el, host } = mount(tag, { maximized: 'true' });
77
+ expect(size(el)).toBe('500x400');
78
+ host.remove();
79
+ });
80
+ });
81
+ }
82
+
83
+ await describe('<adw-window> maximized keeps its size request as a minimum', async () => {
84
+ await it('does not shrink below width-request/height-request', async () => {
85
+ const { el, host } = mount('adw-window', { 'width-request': '600', 'height-request': '450' });
86
+ el.maximize();
87
+ const [width, height] = size(el).split('x').map(Number);
88
+ expect(width >= 600).toBe(true);
89
+ expect(height >= 450).toBe(true);
90
+ host.remove();
91
+ });
92
+ });
93
+ };
@@ -1,37 +0,0 @@
1
- /**
2
- * Make `name` drawable by every `.adw-icon` in the document, from an Adwaita symbolic SVG
3
- * source string (what `@gjsify/adwaita-icons` exports).
4
- *
5
- * BOTH arguments are checked and a wrong one THROWS rather than registering nothing: unlike
6
- * a render, this is an explicit call with a wrong argument, and silently doing nothing is
7
- * the failure mode this whole area exists to end. The name is normalized exactly as
8
- * `<gtk-image icon-name>` normalizes it — a single `-symbolic` suffix comes off, and the rest
9
- * must be one CSS token; the SVG has to parse to an `<svg>` root. `<gtk-image>` draws
10
- * `image-missing` for the same unusable name instead — there it came from markup, and
11
- * taking the page down over a typo is not proportionate.
12
- *
13
- * Registering a name the stylesheet already compiles is allowed and REPLACES the glyph:
14
- * the property is set on the document element, so it wins over the `:root` rule.
15
- *
16
- * CLIENT-SIDE ONLY: this touches `document.documentElement` and `document.head`, so at
17
- * module top level in an SSR/SSG build it throws before a page is rendered.
18
- */
19
- export declare function registerIcon(name: string, svg: string): void;
20
- /**
21
- * Whether `name` draws something other than `image-missing` — a symbolic glyph compiled into
22
- * the stylesheet or registered at runtime, or a colour icon from `registerColorIcon`. The
23
- * name is looked up exactly as `<gtk-image icon-name>` looks it up (`icon-theme.ts`).
24
- *
25
- * Reads the live cascade rather than a generated list, so it answers for a glyph that
26
- * arrived by any route, including a consumer's own `--icon-<name>` declaration. It is
27
- * deliberately the CUSTOM PROPERTY that is read and not the rendered `mask-image` of a
28
- * probe element: since `_icon.scss` gives every icon box the `image-missing` fallback,
29
- * a rendered mask is never `none`, and comparing against the fallback would answer
30
- * `false` for `image-missing` itself — the one name where being drawn and having fallen
31
- * back look identical.
32
- *
33
- * Narrowing worth knowing: a consumer who writes `.adw-icon--x { mask-image: url(…) }`
34
- * with no matching `--icon-x` gets `false` here and a drawn icon anyway. The generator and
35
- * {@link registerIcon} are the two things that create the pair, and both create both.
36
- */
37
- export declare function isIconAvailable(name: string): boolean;