@gjsify/adwaita-web 0.53.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/dist/adwaita-web.css +8070 -3037
  2. package/dist/adwaita-web.css.map +1 -1
  3. package/lib/types/adw-application-window.spec.d.ts +1 -0
  4. package/lib/types/adw-bin.spec.d.ts +1 -0
  5. package/lib/types/adw-breakpoint-bin.spec.d.ts +1 -0
  6. package/lib/types/adw-clamp-scrollable.spec.d.ts +1 -0
  7. package/lib/types/adw-multi-layout-view.spec.d.ts +1 -0
  8. package/lib/types/adw-preferences-row.spec.d.ts +1 -0
  9. package/lib/types/adw-shortcuts.spec.d.ts +1 -0
  10. package/lib/types/adw-tab-bar.spec.d.ts +1 -0
  11. package/lib/types/adw-tab-button.spec.d.ts +1 -0
  12. package/lib/types/adw-tab-overview.spec.d.ts +1 -0
  13. package/lib/types/adw-view-switcher-sidebar.spec.d.ts +1 -0
  14. package/lib/types/adw-window.spec.d.ts +1 -0
  15. package/lib/types/breakpoints.d.ts +14 -3
  16. package/lib/types/construct-vectors.spec.d.ts +1 -0
  17. package/lib/types/elements/adw-application-window.d.ts +27 -0
  18. package/lib/types/elements/adw-bin.d.ts +17 -0
  19. package/lib/types/elements/adw-breakpoint-bin.d.ts +67 -0
  20. package/lib/types/elements/adw-clamp-scrollable.d.ts +38 -0
  21. package/lib/types/elements/adw-dialog.d.ts +10 -0
  22. package/lib/types/elements/adw-layout-slot.d.ts +19 -0
  23. package/lib/types/elements/adw-multi-layout-view.d.ts +101 -0
  24. package/lib/types/elements/adw-preferences-row.d.ts +31 -0
  25. package/lib/types/elements/adw-shortcuts-dialog.d.ts +13 -0
  26. package/lib/types/elements/adw-shortcuts-item.d.ts +36 -0
  27. package/lib/types/elements/adw-shortcuts-section.d.ts +14 -0
  28. package/lib/types/elements/adw-sidebar.d.ts +5 -0
  29. package/lib/types/elements/adw-switch-row.d.ts +3 -0
  30. package/lib/types/elements/adw-tab-bar.d.ts +108 -0
  31. package/lib/types/elements/adw-tab-button.d.ts +32 -0
  32. package/lib/types/elements/adw-tab-overview.d.ts +199 -0
  33. package/lib/types/elements/adw-tab-view.d.ts +19 -23
  34. package/lib/types/elements/adw-view-switcher-sidebar.d.ts +84 -0
  35. package/lib/types/elements/adw-window.d.ts +40 -0
  36. package/lib/types/elements/gtk-about-dialog.d.ts +146 -0
  37. package/lib/types/elements/gtk-application-window.d.ts +34 -0
  38. package/lib/types/elements/gtk-aspect-frame.d.ts +27 -0
  39. package/lib/types/elements/gtk-button.d.ts +9 -0
  40. package/lib/types/elements/gtk-calendar.d.ts +159 -0
  41. package/lib/types/elements/gtk-center-box.d.ts +39 -0
  42. package/lib/types/elements/gtk-color-dialog-button.d.ts +69 -0
  43. package/lib/types/elements/gtk-column-view.d.ts +50 -0
  44. package/lib/types/elements/gtk-drag-icon.d.ts +78 -0
  45. package/lib/types/elements/gtk-drawing-area.d.ts +95 -0
  46. package/lib/types/elements/gtk-editable-label.d.ts +33 -0
  47. package/lib/types/elements/gtk-emoji-chooser.d.ts +84 -0
  48. package/lib/types/elements/gtk-entry.d.ts +20 -1
  49. package/lib/types/elements/gtk-expander.d.ts +49 -0
  50. package/lib/types/elements/gtk-fixed.d.ts +13 -0
  51. package/lib/types/elements/gtk-flow-box-child.d.ts +14 -0
  52. package/lib/types/elements/gtk-flow-box.d.ts +87 -0
  53. package/lib/types/elements/gtk-font-dialog-button.d.ts +83 -0
  54. package/lib/types/elements/gtk-frame.d.ts +24 -0
  55. package/lib/types/elements/gtk-gl-area.d.ts +136 -0
  56. package/lib/types/elements/gtk-graphics-offload.d.ts +24 -0
  57. package/lib/types/elements/gtk-grid-view.d.ts +39 -0
  58. package/lib/types/elements/gtk-grid.d.ts +27 -0
  59. package/lib/types/elements/gtk-header-bar.d.ts +60 -0
  60. package/lib/types/elements/gtk-inscription.d.ts +64 -0
  61. package/lib/types/elements/gtk-label.d.ts +3 -0
  62. package/lib/types/elements/gtk-level-bar.d.ts +59 -0
  63. package/lib/types/elements/gtk-link-button.d.ts +29 -0
  64. package/lib/types/elements/gtk-list-box-row.d.ts +54 -0
  65. package/lib/types/elements/gtk-list-box.d.ts +100 -0
  66. package/lib/types/elements/gtk-list-view.d.ts +73 -0
  67. package/lib/types/elements/gtk-media-controls.d.ts +142 -0
  68. package/lib/types/elements/gtk-notebook.d.ts +148 -0
  69. package/lib/types/elements/gtk-overlay.d.ts +22 -0
  70. package/lib/types/elements/gtk-page-setup-unix-dialog.d.ts +87 -0
  71. package/lib/types/elements/gtk-paned.d.ts +121 -0
  72. package/lib/types/elements/gtk-password-entry.d.ts +27 -0
  73. package/lib/types/elements/gtk-picture.d.ts +66 -0
  74. package/lib/types/elements/gtk-popover-bin.d.ts +82 -0
  75. package/lib/types/elements/gtk-popover-menu-bar.d.ts +66 -0
  76. package/lib/types/elements/gtk-popover-menu.d.ts +83 -0
  77. package/lib/types/elements/gtk-popover.d.ts +28 -3
  78. package/lib/types/elements/gtk-print-unix-dialog.d.ts +167 -0
  79. package/lib/types/elements/gtk-revealer.d.ts +55 -0
  80. package/lib/types/elements/gtk-scale-button.d.ts +59 -0
  81. package/lib/types/elements/gtk-scale.d.ts +98 -0
  82. package/lib/types/elements/gtk-scrollbar.d.ts +124 -0
  83. package/lib/types/elements/gtk-scrolled-window.d.ts +121 -0
  84. package/lib/types/elements/gtk-search-bar.d.ts +39 -0
  85. package/lib/types/elements/gtk-search-entry.d.ts +27 -0
  86. package/lib/types/elements/gtk-separator.d.ts +10 -0
  87. package/lib/types/elements/gtk-spin-button.d.ts +94 -0
  88. package/lib/types/elements/gtk-spinner.d.ts +14 -0
  89. package/lib/types/elements/gtk-stack-sidebar.d.ts +43 -0
  90. package/lib/types/elements/gtk-stack-switcher.d.ts +58 -0
  91. package/lib/types/elements/gtk-stack.d.ts +154 -0
  92. package/lib/types/elements/gtk-switch.d.ts +4 -1
  93. package/lib/types/elements/gtk-text-view.d.ts +62 -0
  94. package/lib/types/elements/gtk-text.d.ts +45 -0
  95. package/lib/types/elements/gtk-toggle-button.d.ts +45 -0
  96. package/lib/types/elements/gtk-tree-expander.d.ts +38 -0
  97. package/lib/types/elements/gtk-video.d.ts +97 -0
  98. package/lib/types/elements/gtk-viewport.d.ts +84 -0
  99. package/lib/types/elements/gtk-window-controls.d.ts +80 -0
  100. package/lib/types/elements/gtk-window-handle.d.ts +39 -0
  101. package/lib/types/elements/gtk-window.d.ts +97 -0
  102. package/lib/types/elements/justification.d.ts +2 -0
  103. package/lib/types/elements/popover-menu.d.ts +18 -0
  104. package/lib/types/elements/roving-focus.d.ts +29 -1
  105. package/lib/types/emoji-data.d.ts +38 -0
  106. package/lib/types/font-description.d.ts +96 -0
  107. package/lib/types/gtk-about-dialog.spec.d.ts +1 -0
  108. package/lib/types/gtk-action-bar.spec.d.ts +1 -0
  109. package/lib/types/gtk-application-window.spec.d.ts +1 -0
  110. package/lib/types/gtk-aspect-frame.spec.d.ts +1 -0
  111. package/lib/types/gtk-calendar.spec.d.ts +1 -0
  112. package/lib/types/gtk-center-box.spec.d.ts +1 -0
  113. package/lib/types/gtk-color-dialog-button.spec.d.ts +1 -0
  114. package/lib/types/gtk-column-view.spec.d.ts +1 -0
  115. package/lib/types/gtk-drag-icon.spec.d.ts +1 -0
  116. package/lib/types/gtk-drawing-area.spec.d.ts +1 -0
  117. package/lib/types/gtk-editable-label.spec.d.ts +1 -0
  118. package/lib/types/gtk-emoji-chooser.spec.d.ts +1 -0
  119. package/lib/types/gtk-expander.spec.d.ts +1 -0
  120. package/lib/types/gtk-fixed.spec.d.ts +1 -0
  121. package/lib/types/gtk-flow-box.spec.d.ts +1 -0
  122. package/lib/types/gtk-font-dialog-button.spec.d.ts +1 -0
  123. package/lib/types/gtk-frame.spec.d.ts +1 -0
  124. package/lib/types/gtk-gl-area.spec.d.ts +1 -0
  125. package/lib/types/gtk-graphics-offload.spec.d.ts +1 -0
  126. package/lib/types/gtk-grid-view.spec.d.ts +1 -0
  127. package/lib/types/gtk-grid.spec.d.ts +1 -0
  128. package/lib/types/gtk-header-bar.spec.d.ts +1 -0
  129. package/lib/types/gtk-inscription.spec.d.ts +1 -0
  130. package/lib/types/gtk-level-bar.spec.d.ts +1 -0
  131. package/lib/types/gtk-link-button.spec.d.ts +1 -0
  132. package/lib/types/gtk-list-box.spec.d.ts +1 -0
  133. package/lib/types/gtk-list-view.spec.d.ts +1 -0
  134. package/lib/types/gtk-media-controls.spec.d.ts +1 -0
  135. package/lib/types/gtk-notebook.spec.d.ts +1 -0
  136. package/lib/types/gtk-overlay.spec.d.ts +1 -0
  137. package/lib/types/gtk-paned.spec.d.ts +1 -0
  138. package/lib/types/gtk-password-entry.spec.d.ts +1 -0
  139. package/lib/types/gtk-picture.spec.d.ts +1 -0
  140. package/lib/types/gtk-popover-bin.spec.d.ts +1 -0
  141. package/lib/types/gtk-popover-menu-bar.spec.d.ts +1 -0
  142. package/lib/types/gtk-popover-menu.spec.d.ts +1 -0
  143. package/lib/types/gtk-popover-role.spec.d.ts +1 -0
  144. package/lib/types/gtk-popover.spec.d.ts +1 -0
  145. package/lib/types/gtk-print-dialogs.spec.d.ts +1 -0
  146. package/lib/types/gtk-revealer.spec.d.ts +1 -0
  147. package/lib/types/gtk-scale-button.spec.d.ts +1 -0
  148. package/lib/types/gtk-scale.spec.d.ts +1 -0
  149. package/lib/types/gtk-scrollbar.spec.d.ts +1 -0
  150. package/lib/types/gtk-scrolled-window.spec.d.ts +1 -0
  151. package/lib/types/gtk-search-bar.spec.d.ts +1 -0
  152. package/lib/types/gtk-search-entry.spec.d.ts +1 -0
  153. package/lib/types/gtk-separator.spec.d.ts +1 -0
  154. package/lib/types/gtk-spin-button.spec.d.ts +1 -0
  155. package/lib/types/gtk-spinner.spec.d.ts +1 -0
  156. package/lib/types/gtk-stack-sidebar.spec.d.ts +1 -0
  157. package/lib/types/gtk-stack-switcher.spec.d.ts +1 -0
  158. package/lib/types/gtk-stack.spec.d.ts +1 -0
  159. package/lib/types/gtk-text-view.spec.d.ts +1 -0
  160. package/lib/types/gtk-text.spec.d.ts +1 -0
  161. package/lib/types/gtk-toggle-button.spec.d.ts +1 -0
  162. package/lib/types/gtk-tree-expander.spec.d.ts +1 -0
  163. package/lib/types/gtk-video.spec.d.ts +1 -0
  164. package/lib/types/gtk-viewport.spec.d.ts +1 -0
  165. package/lib/types/gtk-window-controls.spec.d.ts +1 -0
  166. package/lib/types/gtk-window-handle.spec.d.ts +1 -0
  167. package/lib/types/gtk-window.spec.d.ts +1 -0
  168. package/lib/types/index.d.ts +4 -1
  169. package/lib/types/list-view-dom.d.ts +44 -0
  170. package/lib/types/namespace/adw.d.ts +12 -0
  171. package/lib/types/namespace/gtk.d.ts +61 -0
  172. package/lib/types/page-setup.d.ts +100 -0
  173. package/lib/types/scroll-shading.d.ts +15 -1
  174. package/lib/types/shared-tree-builder.d.ts +30 -2
  175. package/lib/types/signals.d.ts +4 -0
  176. package/lib/types/styles.generated.d.ts +1 -1
  177. package/lib/types/tab-chip.d.ts +73 -0
  178. package/lib/types/template-classes.d.ts +11 -0
  179. package/package.json +12 -8
  180. package/scss/_action_row.scss +2 -2
  181. package/scss/_application_window.scss +26 -0
  182. package/scss/_aspect_frame.scss +25 -0
  183. package/scss/_bin.scss +26 -0
  184. package/scss/_button.scss +45 -0
  185. package/scss/_calendar.scss +176 -0
  186. package/scss/_center_box.scss +25 -0
  187. package/scss/_checks.scss +6 -1
  188. package/scss/_clamp_scrollable.scss +28 -0
  189. package/scss/_color_button.scss +67 -0
  190. package/scss/_column_view.scss +126 -0
  191. package/scss/_drag_icon.scss +55 -0
  192. package/scss/_drawing.scss +85 -0
  193. package/scss/_emoji_chooser.scss +213 -0
  194. package/scss/_entry.scss +13 -5
  195. package/scss/_entry_row.scss +1 -1
  196. package/scss/_expander.scss +113 -0
  197. package/scss/_fixed.scss +29 -0
  198. package/scss/_flow_box.scss +94 -0
  199. package/scss/_font_button.scss +63 -0
  200. package/scss/_frame.scss +41 -0
  201. package/scss/_grid.scss +19 -0
  202. package/scss/_grid_view.scss +46 -0
  203. package/scss/_gtk_about_dialog.scss +186 -0
  204. package/scss/_headerbar.scss +132 -0
  205. package/scss/_icons.generated.scss +186 -0
  206. package/scss/_inscription.scss +125 -0
  207. package/scss/_level_bar.scss +190 -0
  208. package/scss/_link.scss +82 -0
  209. package/scss/_list_box.scss +88 -0
  210. package/scss/_list_view.scss +96 -0
  211. package/scss/_media_controls.scss +139 -0
  212. package/scss/_overlay.scss +68 -0
  213. package/scss/_paned.scss +130 -0
  214. package/scss/_password_entry.scss +83 -0
  215. package/scss/_picture.scss +80 -0
  216. package/scss/_popover_bin.scss +53 -0
  217. package/scss/_popover_menu_bar.scss +104 -0
  218. package/scss/_preferences_row.scss +51 -0
  219. package/scss/_print_dialogs.scss +328 -0
  220. package/scss/_reset.scss +21 -19
  221. package/scss/_revealer.scss +37 -0
  222. package/scss/_row.scss +20 -5
  223. package/scss/_scale.scss +298 -0
  224. package/scss/_scale_button.scss +167 -0
  225. package/scss/_scrollbar.scss +230 -0
  226. package/scss/_scrolled_window.scss +131 -0
  227. package/scss/_search_bar.scss +118 -0
  228. package/scss/_search_entry.scss +86 -0
  229. package/scss/_separator.scss +44 -0
  230. package/scss/_shortcuts_dialog.scss +100 -0
  231. package/scss/_spin_button.scss +172 -0
  232. package/scss/_spin_row.scss +56 -8
  233. package/scss/_spinner.scss +85 -4
  234. package/scss/_stack.scss +729 -0
  235. package/scss/_switch.scss +13 -5
  236. package/scss/_switch_row.scss +10 -0
  237. package/scss/_tab_bar.scss +317 -0
  238. package/scss/_tab_button.scss +98 -0
  239. package/scss/_tab_overview.scss +483 -0
  240. package/scss/_text.scss +182 -0
  241. package/scss/_theme.scss +1 -1
  242. package/scss/_tree_expander.scss +62 -0
  243. package/scss/_variables.scss +43 -21
  244. package/scss/_video.scss +146 -0
  245. package/scss/_view_switcher_sidebar.scss +112 -0
  246. package/scss/_viewport.scss +50 -0
  247. package/scss/_window.scss +118 -1
  248. package/scss/_window_handle.scss +20 -0
  249. package/scss/adwaita-skin.scss +109 -0
  250. package/src/adw-action-rows.spec.ts +76 -0
  251. package/src/adw-application-window.spec.ts +118 -0
  252. package/src/adw-bin.spec.ts +75 -0
  253. package/src/adw-breakpoint-bin.spec.ts +324 -0
  254. package/src/adw-clamp-scrollable.spec.ts +189 -0
  255. package/src/adw-multi-layout-view.spec.ts +243 -0
  256. package/src/adw-preferences-row.spec.ts +164 -0
  257. package/src/adw-row-state.spec.ts +142 -0
  258. package/src/adw-shortcuts.spec.ts +155 -0
  259. package/src/adw-tab-bar.spec.ts +287 -0
  260. package/src/adw-tab-button.spec.ts +101 -0
  261. package/src/adw-tab-overview.spec.ts +443 -0
  262. package/src/adw-view-switcher-sidebar.spec.ts +281 -0
  263. package/src/adw-window.spec.ts +129 -0
  264. package/src/breakpoints.ts +25 -8
  265. package/src/capabilities.d.mts +3 -0
  266. package/src/capabilities.mjs +18 -0
  267. package/src/connect-lifecycle.spec.ts +12 -0
  268. package/src/construct-vectors.spec.ts +175 -0
  269. package/src/elements/adw-application-window.ts +154 -0
  270. package/src/elements/adw-bin.ts +101 -0
  271. package/src/elements/adw-breakpoint-bin.ts +287 -0
  272. package/src/elements/adw-clamp-scrollable.ts +207 -0
  273. package/src/elements/adw-dialog.ts +19 -0
  274. package/src/elements/adw-layout-slot.ts +95 -0
  275. package/src/elements/adw-multi-layout-view.ts +326 -0
  276. package/src/elements/adw-preferences-row.ts +150 -0
  277. package/src/elements/adw-shortcuts-dialog.ts +52 -0
  278. package/src/elements/adw-shortcuts-item.ts +171 -0
  279. package/src/elements/adw-shortcuts-section.ts +86 -0
  280. package/src/elements/adw-sidebar.ts +42 -3
  281. package/src/elements/adw-switch-row.ts +28 -1
  282. package/src/elements/adw-tab-bar.ts +529 -0
  283. package/src/elements/adw-tab-button.ts +194 -0
  284. package/src/elements/adw-tab-overview.ts +1011 -0
  285. package/src/elements/adw-tab-view.ts +66 -145
  286. package/src/elements/adw-toggle-group.ts +20 -5
  287. package/src/elements/adw-view-stack.ts +18 -0
  288. package/src/elements/adw-view-switcher-sidebar.ts +332 -0
  289. package/src/elements/adw-window.ts +185 -11
  290. package/src/elements/checks.ts +35 -8
  291. package/src/elements/gtk-about-dialog.ts +811 -0
  292. package/src/elements/gtk-application-window.ts +108 -0
  293. package/src/elements/gtk-aspect-frame.ts +160 -0
  294. package/src/elements/gtk-button.ts +12 -0
  295. package/src/elements/gtk-calendar.ts +757 -0
  296. package/src/elements/gtk-center-box.ts +184 -0
  297. package/src/elements/gtk-color-dialog-button.ts +278 -0
  298. package/src/elements/gtk-column-view.ts +320 -0
  299. package/src/elements/gtk-drag-icon.ts +257 -0
  300. package/src/elements/gtk-drawing-area.ts +303 -0
  301. package/src/elements/gtk-editable-label.ts +204 -0
  302. package/src/elements/gtk-emoji-chooser.ts +542 -0
  303. package/src/elements/gtk-entry.ts +39 -5
  304. package/src/elements/gtk-expander.ts +301 -0
  305. package/src/elements/gtk-fixed.ts +99 -0
  306. package/src/elements/gtk-flow-box-child.ts +68 -0
  307. package/src/elements/gtk-flow-box.ts +480 -0
  308. package/src/elements/gtk-font-dialog-button.ts +432 -0
  309. package/src/elements/gtk-frame.ts +174 -0
  310. package/src/elements/gtk-gl-area.ts +476 -0
  311. package/src/elements/gtk-graphics-offload.ts +130 -0
  312. package/src/elements/gtk-grid-view.ts +168 -0
  313. package/src/elements/gtk-grid.ts +127 -0
  314. package/src/elements/gtk-header-bar.ts +273 -0
  315. package/src/elements/gtk-inscription.ts +387 -0
  316. package/src/elements/gtk-label.ts +19 -11
  317. package/src/elements/gtk-level-bar.ts +323 -0
  318. package/src/elements/gtk-link-button.ts +138 -0
  319. package/src/elements/gtk-list-box-row.ts +195 -0
  320. package/src/elements/gtk-list-box.ts +413 -0
  321. package/src/elements/gtk-list-view.ts +370 -0
  322. package/src/elements/gtk-media-controls.ts +509 -0
  323. package/src/elements/gtk-notebook.ts +664 -0
  324. package/src/elements/gtk-overlay.ts +149 -0
  325. package/src/elements/gtk-page-setup-unix-dialog.ts +420 -0
  326. package/src/elements/gtk-paned.ts +597 -0
  327. package/src/elements/gtk-password-entry.ts +170 -0
  328. package/src/elements/gtk-picture.ts +254 -0
  329. package/src/elements/gtk-popover-bin.ts +332 -0
  330. package/src/elements/gtk-popover-menu-bar.ts +355 -0
  331. package/src/elements/gtk-popover-menu.ts +339 -0
  332. package/src/elements/gtk-popover.ts +92 -10
  333. package/src/elements/gtk-print-unix-dialog.ts +989 -0
  334. package/src/elements/gtk-progress-bar.ts +24 -11
  335. package/src/elements/gtk-revealer.ts +406 -0
  336. package/src/elements/gtk-scale-button.ts +358 -0
  337. package/src/elements/gtk-scale.ts +492 -0
  338. package/src/elements/gtk-scrollbar.ts +528 -0
  339. package/src/elements/gtk-scrolled-window.ts +642 -0
  340. package/src/elements/gtk-search-bar.ts +200 -0
  341. package/src/elements/gtk-search-entry.ts +172 -0
  342. package/src/elements/gtk-separator.ts +52 -0
  343. package/src/elements/gtk-spin-button.ts +475 -0
  344. package/src/elements/gtk-spinner.ts +126 -0
  345. package/src/elements/gtk-stack-sidebar.ts +212 -0
  346. package/src/elements/gtk-stack-switcher.ts +279 -0
  347. package/src/elements/gtk-stack.ts +748 -0
  348. package/src/elements/gtk-switch.ts +52 -19
  349. package/src/elements/gtk-text-view.ts +290 -0
  350. package/src/elements/gtk-text.ts +219 -0
  351. package/src/elements/gtk-toggle-button.ts +239 -0
  352. package/src/elements/gtk-tree-expander.ts +243 -0
  353. package/src/elements/gtk-video.ts +423 -0
  354. package/src/elements/gtk-viewport.ts +277 -0
  355. package/src/elements/gtk-window-controls.ts +341 -0
  356. package/src/elements/gtk-window-handle.ts +221 -0
  357. package/src/elements/gtk-window.ts +366 -0
  358. package/src/elements/justification.ts +24 -0
  359. package/src/elements/popover-menu.ts +24 -0
  360. package/src/elements/roving-focus.ts +53 -21
  361. package/src/emoji-data.ts +577 -0
  362. package/src/entry-rows.spec.ts +31 -0
  363. package/src/font-description.ts +238 -0
  364. package/src/gtk-about-dialog.spec.ts +250 -0
  365. package/src/gtk-action-bar.spec.ts +89 -0
  366. package/src/gtk-application-window.spec.ts +107 -0
  367. package/src/gtk-aspect-frame.spec.ts +114 -0
  368. package/src/gtk-calendar.spec.ts +589 -0
  369. package/src/gtk-center-box.spec.ts +125 -0
  370. package/src/gtk-color-dialog-button.spec.ts +141 -0
  371. package/src/gtk-column-view.spec.ts +154 -0
  372. package/src/gtk-drag-icon.spec.ts +190 -0
  373. package/src/gtk-drawing-area.spec.ts +211 -0
  374. package/src/gtk-editable-label.spec.ts +190 -0
  375. package/src/gtk-emoji-chooser.spec.ts +173 -0
  376. package/src/gtk-entry.spec.ts +23 -0
  377. package/src/gtk-expander.spec.ts +170 -0
  378. package/src/gtk-fixed.spec.ts +97 -0
  379. package/src/gtk-flow-box.spec.ts +289 -0
  380. package/src/gtk-font-dialog-button.spec.ts +166 -0
  381. package/src/gtk-frame.spec.ts +119 -0
  382. package/src/gtk-gl-area.spec.ts +361 -0
  383. package/src/gtk-graphics-offload.spec.ts +119 -0
  384. package/src/gtk-grid-view.spec.ts +106 -0
  385. package/src/gtk-grid.spec.ts +122 -0
  386. package/src/gtk-header-bar.spec.ts +202 -0
  387. package/src/gtk-inscription.spec.ts +235 -0
  388. package/src/gtk-level-bar.spec.ts +199 -0
  389. package/src/gtk-link-button.spec.ts +117 -0
  390. package/src/gtk-list-box.spec.ts +422 -0
  391. package/src/gtk-list-view.spec.ts +203 -0
  392. package/src/gtk-media-controls.spec.ts +295 -0
  393. package/src/gtk-notebook.spec.ts +546 -0
  394. package/src/gtk-overlay.spec.ts +141 -0
  395. package/src/gtk-paned.spec.ts +267 -0
  396. package/src/gtk-password-entry.spec.ts +150 -0
  397. package/src/gtk-picture.spec.ts +172 -0
  398. package/src/gtk-popover-bin.spec.ts +229 -0
  399. package/src/gtk-popover-menu-bar.spec.ts +296 -0
  400. package/src/gtk-popover-menu.spec.ts +261 -0
  401. package/src/gtk-popover-role.spec.ts +138 -0
  402. package/src/gtk-popover.spec.ts +264 -0
  403. package/src/gtk-print-dialogs.spec.ts +251 -0
  404. package/src/gtk-revealer.spec.ts +164 -0
  405. package/src/gtk-scale-button.spec.ts +218 -0
  406. package/src/gtk-scale.spec.ts +213 -0
  407. package/src/gtk-scrollbar.spec.ts +244 -0
  408. package/src/gtk-scrolled-window.spec.ts +262 -0
  409. package/src/gtk-search-bar.spec.ts +179 -0
  410. package/src/gtk-search-entry.spec.ts +142 -0
  411. package/src/gtk-separator.spec.ts +74 -0
  412. package/src/gtk-spin-button.spec.ts +186 -0
  413. package/src/gtk-spinner.spec.ts +130 -0
  414. package/src/gtk-stack-sidebar.spec.ts +217 -0
  415. package/src/gtk-stack-switcher.spec.ts +249 -0
  416. package/src/gtk-stack.spec.ts +432 -0
  417. package/src/gtk-text-view.spec.ts +189 -0
  418. package/src/gtk-text.spec.ts +163 -0
  419. package/src/gtk-toggle-button.spec.ts +186 -0
  420. package/src/gtk-tree-expander.spec.ts +201 -0
  421. package/src/gtk-video.spec.ts +240 -0
  422. package/src/gtk-viewport.spec.ts +140 -0
  423. package/src/gtk-window-controls.spec.ts +232 -0
  424. package/src/gtk-window-handle.spec.ts +158 -0
  425. package/src/gtk-window.spec.ts +190 -0
  426. package/src/index.ts +9 -1
  427. package/src/keyboard-operable.spec.ts +33 -1
  428. package/src/list-view-dom.ts +121 -0
  429. package/src/namespace/adw.ts +12 -0
  430. package/src/namespace/gtk.ts +61 -0
  431. package/src/page-setup.ts +222 -0
  432. package/src/scroll-shading.ts +18 -1
  433. package/src/shared-tree-builder.ts +263 -21
  434. package/src/signals.ts +15 -0
  435. package/src/source-view/theme.ts +11 -5
  436. package/src/style-classes.spec.ts +9 -8
  437. package/src/styles.generated.ts +1 -1
  438. package/src/tab-chip.ts +200 -0
  439. package/src/template-classes.ts +45 -0
  440. package/src/test.browser.mts +152 -0
@@ -0,0 +1,171 @@
1
+ // <adw-shortcuts-item> — one shortcut row: a title, an optional subtitle and an
2
+ // accelerator, drawn as keycaps. The browser counterpart of `AdwShortcutsItem`,
3
+ // which upstream is a plain `GObject` (adw-shortcuts-item.c:39) holding four
4
+ // strings and a text direction, and is a row rather than a widget — hence a tag
5
+ // here, the same shape `<adw-sidebar-item>` and `<adw-toggle>` are.
6
+ //
7
+ // THE ACCELERATOR IS `<adw-shortcut-label>`'s to draw. The C validates the string
8
+ // against `AdwShortcutLabel`'s own grammar (adw-shortcuts-item.c:19-24) and this
9
+ // element hands the very same attribute to the very same element, so the parse is
10
+ // core's `parseShortcutLabel` once rather than a second grammar that drifts from it.
11
+ //
12
+ // `action-name` is the OTHER half and the port has nothing to resolve it with: an
13
+ // accelerator for an action comes from `Gtk.Application.set_accels_for_action`, and a
14
+ // document has no application to ask. So it is kept as an attribute — a reader can
15
+ // still see which action a row stands for — and the accelerator beside it is what is
16
+ // DRAWN. That is the fallback the class itself documents ("If both are specified, the
17
+ // accelerator will be used if the action couldn't be found", adw-shortcuts-item.c:19-23).
18
+ //
19
+ // `direction` is honoured the way the class means it: a row for a direction the
20
+ // document is not in is hidden, which is how one dialog lists both an LTR and an RTL
21
+ // accelerator for the same action (adw-shortcuts-item.c:25-28).
22
+ //
23
+ // Attributes:
24
+ // title (AdwShortcutsItem:title — the row's name)
25
+ // subtitle (AdwShortcutsItem:subtitle — the line under it, drawn dimmed and
26
+ // caption-sized, the `.title-box > .subtitle` rule at _shortcuts-dialog.scss:23-26)
27
+ // accelerator (AdwShortcutsItem:accelerator — `<Control>C`, `<Shift>A Home`; the
28
+ // `<adw-shortcut-label>` grammar)
29
+ // action-name (AdwShortcutsItem:action-name — resolved on GTK, kept here)
30
+ // direction (AdwShortcutsItem:direction — `ltr` | `rtl` | `none`; a row for the
31
+ // other direction is hidden)
32
+ //
33
+ // Properties: `itemType` — whether an accelerator was given, `hasAccelerator`.
34
+ //
35
+ // Reference: refs/libadwaita/src/adw-shortcuts-item.c
36
+ // Reference: refs/libadwaita/src/stylesheet/widgets/_shortcuts-dialog.scss:16-27
37
+ // Copyright (c) 2025 GNOME Foundation Inc. (libadwaita). LGPLv2.1+
38
+ // Modifications: Implemented as a Web Component for @gjsify/adwaita-web.
39
+
40
+ /**
41
+ * `AdwShortcutsItem:direction` is a `GtkTextDirection`, so it carries `none` beside the
42
+ * two directions — and `none` is the default, meaning "show this row either way".
43
+ *
44
+ * NOT `AdwTextDirection` from core: that one is the split views' pair (`'ltr' | 'rtl'`,
45
+ * split-view.ts:41), which cannot hold the value the C defaults this property to.
46
+ */
47
+ export type AdwShortcutsItemDirection = 'ltr' | 'rtl' | 'none';
48
+
49
+ const DIRECTIONS: readonly AdwShortcutsItemDirection[] = ['ltr', 'rtl', 'none'];
50
+
51
+ export class AdwShortcutsItem extends HTMLElement {
52
+ private _initialized = false;
53
+ private _titleEl!: HTMLSpanElement;
54
+ private _subtitleEl!: HTMLSpanElement;
55
+ private _labelEl!: HTMLElement;
56
+
57
+ static get observedAttributes() {
58
+ return ['title', 'subtitle', 'accelerator', 'action-name', 'direction'];
59
+ }
60
+
61
+ /** The row's title (AdwShortcutsItem:title). */
62
+ get title(): string {
63
+ return this.getAttribute('title') ?? '';
64
+ }
65
+
66
+ set title(value: string) {
67
+ this.setAttribute('title', value);
68
+ }
69
+
70
+ /** The row's subtitle (AdwShortcutsItem:subtitle). */
71
+ get subtitle(): string {
72
+ return this.getAttribute('subtitle') ?? '';
73
+ }
74
+
75
+ set subtitle(value: string) {
76
+ this.setAttribute('subtitle', value);
77
+ }
78
+
79
+ /** The accelerator, in `<adw-shortcut-label>`'s grammar (AdwShortcutsItem:accelerator). */
80
+ get accelerator(): string {
81
+ return this.getAttribute('accelerator') ?? '';
82
+ }
83
+
84
+ set accelerator(value: string) {
85
+ if (value) this.setAttribute('accelerator', value);
86
+ else this.removeAttribute('accelerator');
87
+ }
88
+
89
+ /** The action this row stands for; resolved by a GtkApplication on GTK. */
90
+ get actionName(): string {
91
+ return this.getAttribute('action-name') ?? '';
92
+ }
93
+
94
+ set actionName(value: string) {
95
+ if (value) this.setAttribute('action-name', value);
96
+ else this.removeAttribute('action-name');
97
+ }
98
+
99
+ /** The text direction this row belongs to (AdwShortcutsItem:direction). */
100
+ get direction(): AdwShortcutsItemDirection {
101
+ const value = this.getAttribute('direction') as AdwShortcutsItemDirection | null;
102
+ return value && DIRECTIONS.includes(value) ? value : 'none';
103
+ }
104
+
105
+ set direction(value: AdwShortcutsItemDirection) {
106
+ this.setAttribute('direction', value);
107
+ }
108
+
109
+ /** Whether a row carries an accelerator or stands for an action alone. */
110
+ get hasAccelerator(): boolean {
111
+ return this.accelerator.length > 0;
112
+ }
113
+
114
+ connectedCallback() {
115
+ if (this._initialized) return;
116
+ this._initialized = true;
117
+
118
+ // `GTK_ACCESSIBLE_ROLE_LIST_ITEM` in spirit: a row in a list of shortcuts, and
119
+ // the accelerator beside it is already `role="img"` with its own name.
120
+ this.setAttribute('role', 'listitem');
121
+
122
+ this._titleEl = document.createElement('span');
123
+ this._titleEl.className = 'adw-shortcuts-item-title';
124
+
125
+ this._subtitleEl = document.createElement('span');
126
+ this._subtitleEl.className = 'adw-shortcuts-item-subtitle';
127
+
128
+ // The keycaps: the one element that owns the accelerator grammar.
129
+ this._labelEl = document.createElement('adw-shortcut-label');
130
+ this._labelEl.className = 'adw-shortcuts-item-label';
131
+
132
+ this.replaceChildren(this._titleEl, this._subtitleEl, this._labelEl);
133
+ this._render();
134
+ }
135
+
136
+ attributeChangedCallback(name: string) {
137
+ if (!this._initialized) return;
138
+ if (name === 'direction' || name === 'accelerator' || name === 'action-name') this._render();
139
+ else if (name === 'title') this._titleEl.textContent = this.title;
140
+ else if (name === 'subtitle') this._renderSubtitle();
141
+ }
142
+
143
+ private _render(): void {
144
+ this._titleEl.textContent = this.title;
145
+ this._renderSubtitle();
146
+ this._labelEl.setAttribute('accelerator', this.accelerator);
147
+
148
+ // A row that stands for an action alone has nothing to draw on the trailing
149
+ // side — `AdwShortcutLabel` shows its `disabled-text` placeholder for an empty
150
+ // accelerator, which is the wrong picture for a row that never had one.
151
+ this._labelEl.hidden = !this.hasAccelerator;
152
+
153
+ // The class's own rule (adw-shortcuts-item.c:25-28): a direction-specific row
154
+ // is shown only in that direction, so one dialog can carry both.
155
+ const direction = this.direction;
156
+ if (direction !== 'none') {
157
+ const ours = getComputedStyle(this).direction;
158
+ this.hidden = ours !== direction;
159
+ } else {
160
+ this.hidden = false;
161
+ }
162
+ }
163
+
164
+ private _renderSubtitle(): void {
165
+ const subtitle = this.subtitle;
166
+ this._subtitleEl.textContent = subtitle;
167
+ this._subtitleEl.hidden = subtitle.length === 0;
168
+ }
169
+ }
170
+
171
+ customElements.define('adw-shortcuts-item', AdwShortcutsItem);
@@ -0,0 +1,86 @@
1
+ // <adw-shortcuts-section> — one titled group of shortcuts inside an
2
+ // <adw-shortcuts-dialog>: the browser counterpart of `AdwShortcutsSection`, which
3
+ // upstream is a plain `GObject` (`G_DEFINE_FINAL_TYPE_WITH_CODE (…, G_TYPE_OBJECT)`
4
+ // in adw-shortcuts-section.c:44) implementing `GtkBuildable` and `Gio.ListModel`.
5
+ // It has no look of its own — libadwaita draws it as a preferences GROUP inside the
6
+ // dialog's page, and every row is a `AdwShortcutsItem` (`.shortcut-row`, styled at
7
+ // _shortcuts-dialog.scss:16-27).
8
+ //
9
+ // A tag anyway, and that is the same shape `<adw-sidebar-item>` and `<adw-toggle>`
10
+ // are: a GObject that is not a GtkWidget has no tag in a table of concrete widgets,
11
+ // and the mark-up form of `GtkBuildable`'s add-child is the only way a document can
12
+ // declare one. `scripts/check-vocabulary-alignment.mjs` records that in
13
+ // `WEB_ELEMENT_ALIGNMENT`.
14
+ //
15
+ // Children are `<adw-shortcuts-item>` elements, and they stay LIVE: a shortcut added
16
+ // after connect lands in the section (`bindSlottedChildren`).
17
+ //
18
+ // Attributes:
19
+ // title (AdwShortcutsSection:title — the heading; an untitled section is the
20
+ // "subdivide a section into groups" case the class documents)
21
+ //
22
+ // Properties: `items` (the section's shortcuts, in document order).
23
+ //
24
+ // Reference: refs/libadwaita/src/adw-shortcuts-section.c
25
+ // Reference: refs/libadwaita/src/stylesheet/widgets/_shortcuts-dialog.scss:1-14
26
+ // Copyright (c) 2025 GNOME Foundation Inc. (libadwaita). LGPLv2.1+
27
+ // Modifications: Implemented as a Web Component for @gjsify/adwaita-web.
28
+
29
+ import { bindSlottedChildren } from '../slotted-children.js';
30
+
31
+ export class AdwShortcutsSection extends HTMLElement {
32
+ private _initialized = false;
33
+ private _bodyEl!: HTMLDivElement;
34
+ private _titleEl!: HTMLElement;
35
+
36
+ static get observedAttributes() {
37
+ return ['title'];
38
+ }
39
+
40
+ /** The section title (AdwShortcutsSection:title). */
41
+ get title(): string {
42
+ return this.getAttribute('title') ?? '';
43
+ }
44
+
45
+ set title(value: string) {
46
+ this.setAttribute('title', value);
47
+ }
48
+
49
+ /** The shortcuts in this section, in document order (AdwShortcutsSection:n-items' list). */
50
+ get items(): readonly HTMLElement[] {
51
+ return [...this._bodyEl.children] as HTMLElement[];
52
+ }
53
+
54
+ connectedCallback() {
55
+ if (this._initialized) return;
56
+ this._initialized = true;
57
+
58
+ this._titleEl = document.createElement('div');
59
+ this._titleEl.className = 'adw-shortcuts-section-title';
60
+
61
+ this._bodyEl = document.createElement('div');
62
+ this._bodyEl.className = 'adw-shortcuts-section-body';
63
+
64
+ // A `Gio.ListModel` the section can also be read as, so the row list is a
65
+ // container with a name rather than bare children.
66
+ this.setAttribute('role', 'group');
67
+ bindSlottedChildren(this, [{ into: this._bodyEl }]).install(this._titleEl, this._bodyEl);
68
+
69
+ this._render();
70
+ }
71
+
72
+ attributeChangedCallback(name: string) {
73
+ if (!this._initialized) return;
74
+ if (name === 'title') this._render();
75
+ }
76
+
77
+ private _render(): void {
78
+ const title = this.title;
79
+ // An untitled section is a legal thing to write: the class documents it as the
80
+ // way to subdivide a section into groups, and libadwaita draws no heading for it.
81
+ this._titleEl.textContent = title;
82
+ this._titleEl.hidden = title.length === 0;
83
+ }
84
+ }
85
+
86
+ customElements.define('adw-shortcuts-section', AdwShortcutsSection);
@@ -22,9 +22,14 @@
22
22
  // <adw-sidebar-section title="…"> — a titled group of items. An untitled
23
23
  // section renders a separator before its rows (first section: nothing),
24
24
  // mirroring AdwSidebar's stack header (title vs separator child).
25
- // <adw-sidebar-item title="…" subtitle="…" icon-name="…" disabled hidden> —
25
+ // <adw-sidebar-item title="…" subtitle="…" icon-name="…" disabled hidden
26
+ // needs-attention badge-number="3"> —
26
27
  // one row. `disabled` is AdwSidebarItem:enabled=false (bound to the row's
27
- // `sensitive`), `hidden` is AdwSidebarItem:visible=false.
28
+ // `sensitive`), `hidden` is AdwSidebarItem:visible=false, and the last two are the
29
+ // INDICATOR `AdwViewSwitcherSidebar` puts in `AdwSidebarItem:suffix`
30
+ // (`update_badge`, adw-view-switcher-sidebar.c:133-181): a bare dot for
31
+ // `needs-attention` with no count, a `999+`-capped label once there is one, and
32
+ // `.needs-attention` on the bin when attention is asked for either way.
28
33
  // Attributes (on <adw-sidebar>):
29
34
  // mode (sidebar | page, default sidebar) — mirrors Adw.Sidebar:mode.
30
35
  // selected (zero-based flat item index; anything that is not a valid position
@@ -45,6 +50,7 @@
45
50
  // Modifications: Implemented as a Web Component for @gjsify/adwaita-web; the
46
51
  // icon nodes are <gtk-image>.
47
52
 
53
+ import { viewSwitcherBadgeLabel } from '@gjsify/adwaita-core';
48
54
  import {
49
55
  ADW_SIDEBAR_NO_SELECTION,
50
56
  SidebarState,
@@ -69,7 +75,7 @@ const sectionBindings = new WeakMap<AdwSidebarSection, { sidebar: AdwSidebar; sp
69
75
  /** A single sidebar item. Child of <adw-sidebar-section>; consumed at connect time. */
70
76
  export class AdwSidebarItem extends HTMLElement {
71
77
  static get observedAttributes() {
72
- return ['title', 'subtitle', 'icon-name', 'disabled', 'hidden'];
78
+ return ['title', 'subtitle', 'icon-name', 'disabled', 'hidden', 'needs-attention', 'badge-number'];
73
79
  }
74
80
 
75
81
  /**
@@ -104,6 +110,8 @@ export class AdwSidebarItem extends HTMLElement {
104
110
  else if (name === 'icon-name') binding.spec.iconName = value;
105
111
  else if (name === 'disabled') binding.spec.enabled = newValue === null;
106
112
  else if (name === 'hidden') binding.spec.visible = newValue === null;
113
+ else if (name === 'needs-attention') binding.spec.needsAttention = newValue === null;
114
+ else if (name === 'badge-number') binding.spec.badgeNumber = Number.parseInt(value, 10) || 0;
107
115
 
108
116
  binding.sidebar.refresh();
109
117
  }
@@ -257,6 +265,8 @@ export class AdwSidebar extends HTMLElement {
257
265
  iconName: itemEl.getAttribute('icon-name') ?? '',
258
266
  enabled: !itemEl.hasAttribute('disabled'),
259
267
  visible: !itemEl.hasAttribute('hidden'),
268
+ badgeNumber: Number.parseInt(itemEl.getAttribute('badge-number') ?? '0', 10) || 0,
269
+ needsAttention: itemEl.hasAttribute('needs-attention'),
260
270
  };
261
271
  itemBindings.set(itemEl, { sidebar: this, spec: item });
262
272
  items.push(item);
@@ -391,6 +401,12 @@ export class AdwSidebar extends HTMLElement {
391
401
 
392
402
  row.appendChild(textEl);
393
403
 
404
+ // `update_badge` (adw-view-switcher-sidebar.c:133-181): no attention and no count
405
+ // means NO bin at all, a count means the bin loses `.dot` and gains the label, and
406
+ // a drop back to zero takes the label away and puts `.dot` back. The cap is
407
+ // `> 999`, which is `viewSwitcherBadgeLabel`'s rule, so 999 itself prints.
408
+ row.appendChild(this._createIndicator(item));
409
+
394
410
  // Page mode adds a trailing chevron on every row, the way the boxed-list
395
411
  // AdwActionRow carries a `go-next-symbolic` arrow.
396
412
  row.appendChild(createGtkImage('go-next', 'adw-sidebar-item-arrow'));
@@ -400,6 +416,29 @@ export class AdwSidebar extends HTMLElement {
400
416
  return row;
401
417
  }
402
418
 
419
+ /**
420
+ * The item's INDICATOR bin — C's `AdwBin` with `.indicator`, `.dot` and the
421
+ * optional `.needs-attention`, holding an `AdwFadingLabel`'s worth of text.
422
+ */
423
+ private _createIndicator(item: AdwSidebarItemSpec): HTMLElement {
424
+ const badge = item.badgeNumber ?? 0;
425
+ const attention = item.needsAttention === true;
426
+ const bin = document.createElement('span');
427
+ bin.className = 'indicator';
428
+ // Hidden, not absent: `set_suffix (item, NULL)` in C REMOVES the bin, and the
429
+ // difference is only observable through the suffix property.
430
+ bin.hidden = !attention && badge === 0;
431
+ bin.classList.toggle('dot', badge === 0);
432
+ bin.classList.toggle('needs-attention', attention);
433
+ if (badge > 0) {
434
+ const label = document.createElement('span');
435
+ label.className = 'numeric';
436
+ label.textContent = viewSwitcherBadgeLabel(badge);
437
+ bin.appendChild(label);
438
+ }
439
+ return bin;
440
+ }
441
+
403
442
  private _applyMode(): void {
404
443
  const page = this._state.mode === 'page';
405
444
  this.classList.toggle('page', page);
@@ -10,6 +10,10 @@
10
10
  // - clicking the ROW toggles: `adw_switch_row_init` points the activatable-widget at the
11
11
  // slider, so the title is part of the control, not just the handle.
12
12
  //
13
+ // Slots: `slot="prefix"` holds a leading icon/widget, exactly as on
14
+ // `<adw-action-row>` — libadwaita's AdwSwitchRow IS an AdwActionRow
15
+ // (adw-switch-row.c:50), so `add_prefix` is inherited, not invented here.
16
+ //
13
17
  // Adapted from Adwaita Web UI Framework (https://github.com/mclellac/adwaita-web).
14
18
  // Copyright (c) 2025 csm. MIT License.
15
19
  // Modifications: Reimplemented as Web Component for @gjsify/adwaita-web;
@@ -18,6 +22,9 @@
18
22
 
19
23
  import { SwitchRowState, deriveRowLabels } from '@gjsify/adwaita-core';
20
24
 
25
+ import { bindEmptySections } from '../empty-sections.js';
26
+ import { bindSlottedChildren } from '../slotted-children.js';
27
+
21
28
  // SIDE-EFFECT import, deliberately separate from the type import below: it guarantees
22
29
  // `gtk-switch` is defined before this module's `customElements.define` can upgrade a
23
30
  // server-rendered `<adw-switch-row>` and build one. A combined `import { GtkSwitch }`
@@ -30,6 +37,7 @@ import type { GtkSwitch } from './gtk-switch.js';
30
37
 
31
38
  export class AdwSwitchRow extends HTMLElement {
32
39
  private _switchEl!: GtkSwitch;
40
+ private _prefixEl!: HTMLDivElement;
33
41
  private _titleEl!: HTMLSpanElement;
34
42
  private _subtitleEl!: HTMLSpanElement;
35
43
  /** The headless active flag + its notify rule (ADR 0004). */
@@ -40,6 +48,11 @@ export class AdwSwitchRow extends HTMLElement {
40
48
  return ['title', 'subtitle', 'active'];
41
49
  }
42
50
 
51
+ /** The start (prefix) section — append icons/widgets here imperatively. */
52
+ get prefixSection(): HTMLDivElement {
53
+ return this._prefixEl;
54
+ }
55
+
43
56
  get active(): boolean {
44
57
  return this._initialized ? this._state.active : this.hasAttribute('active');
45
58
  }
@@ -62,11 +75,25 @@ export class AdwSwitchRow extends HTMLElement {
62
75
  this._subtitleEl.className = 'adw-row-subtitle';
63
76
  text.append(this._titleEl, this._subtitleEl);
64
77
 
78
+ this._prefixEl = document.createElement('div');
79
+ this._prefixEl.className = 'adw-switch-row-prefix';
80
+
65
81
  this._switchEl = document.createElement('gtk-switch') as GtkSwitch;
66
82
  // adw-switch-row.c:159 — the slider is not a focus target; the ROW is.
67
83
  this._switchEl.unfocusable = true;
68
84
 
69
- this.replaceChildren(text, this._switchEl);
85
+ // The prefix stays LIVE, as on every other slotted row: an icon appended with
86
+ // `slot="prefix"` after connect has to land where the declared one does.
87
+ // `src/slotted-children.ts` carries the incident.
88
+ bindSlottedChildren(this, [{ name: 'prefix', into: this._prefixEl }]).install(
89
+ this._prefixEl,
90
+ text,
91
+ this._switchEl,
92
+ );
93
+ // Same reason as the action row's: an icon appended into `prefixSection` is a
94
+ // childList change no attribute callback hears, so the section would stay hidden
95
+ // and the icon measure 0x0. AFTER the routing — it derives once synchronously.
96
+ bindEmptySections(this._prefixEl);
70
97
 
71
98
  this._state.setActive(this.hasAttribute('active'));
72
99
  this._switchEl.active = this._state.active;