@gjsify/adwaita-web 0.54.0 → 0.56.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 (479) hide show
  1. package/README.md +8 -0
  2. package/dist/adwaita-web.css +8146 -3011
  3. package/dist/adwaita-web.css.map +1 -1
  4. package/lib/types/adw-application-window.spec.d.ts +1 -0
  5. package/lib/types/adw-bin.spec.d.ts +1 -0
  6. package/lib/types/adw-breakpoint-bin.spec.d.ts +1 -0
  7. package/lib/types/adw-clamp-scrollable.spec.d.ts +1 -0
  8. package/lib/types/adw-multi-layout-view.spec.d.ts +1 -0
  9. package/lib/types/adw-preferences-row.spec.d.ts +1 -0
  10. package/lib/types/adw-shortcuts.spec.d.ts +1 -0
  11. package/lib/types/adw-status-page.spec.d.ts +1 -0
  12. package/lib/types/adw-tab-bar.spec.d.ts +1 -0
  13. package/lib/types/adw-tab-button.spec.d.ts +1 -0
  14. package/lib/types/adw-tab-overview.spec.d.ts +1 -0
  15. package/lib/types/adw-view-switcher-sidebar.spec.d.ts +1 -0
  16. package/lib/types/adw-window.spec.d.ts +1 -0
  17. package/lib/types/attributes.d.ts +19 -0
  18. package/lib/types/breakpoints.d.ts +14 -3
  19. package/lib/types/construct-vectors.spec.d.ts +1 -0
  20. package/lib/types/elements/adw-action-row.d.ts +4 -0
  21. package/lib/types/elements/adw-application-window.d.ts +27 -0
  22. package/lib/types/elements/adw-bin.d.ts +17 -0
  23. package/lib/types/elements/adw-breakpoint-bin.d.ts +67 -0
  24. package/lib/types/elements/adw-clamp-scrollable.d.ts +38 -0
  25. package/lib/types/elements/adw-combo-row.d.ts +4 -0
  26. package/lib/types/elements/adw-dialog.d.ts +10 -0
  27. package/lib/types/elements/adw-entry-row.d.ts +6 -0
  28. package/lib/types/elements/adw-expander-row.d.ts +2 -0
  29. package/lib/types/elements/adw-header-bar.d.ts +6 -0
  30. package/lib/types/elements/adw-layout-slot.d.ts +19 -0
  31. package/lib/types/elements/adw-multi-layout-view.d.ts +101 -0
  32. package/lib/types/elements/adw-overlay-split-view.d.ts +13 -0
  33. package/lib/types/elements/adw-preferences-row.d.ts +31 -0
  34. package/lib/types/elements/adw-shortcuts-dialog.d.ts +13 -0
  35. package/lib/types/elements/adw-shortcuts-item.d.ts +36 -0
  36. package/lib/types/elements/adw-shortcuts-section.d.ts +14 -0
  37. package/lib/types/elements/adw-sidebar.d.ts +8 -2
  38. package/lib/types/elements/adw-spin-row.d.ts +6 -0
  39. package/lib/types/elements/adw-switch-row.d.ts +7 -0
  40. package/lib/types/elements/adw-tab-bar.d.ts +108 -0
  41. package/lib/types/elements/adw-tab-button.d.ts +32 -0
  42. package/lib/types/elements/adw-tab-overview.d.ts +199 -0
  43. package/lib/types/elements/adw-tab-view.d.ts +19 -23
  44. package/lib/types/elements/adw-toggle-group.d.ts +17 -0
  45. package/lib/types/elements/adw-view-switcher-sidebar.d.ts +84 -0
  46. package/lib/types/elements/adw-window.d.ts +40 -0
  47. package/lib/types/elements/gtk-about-dialog.d.ts +146 -0
  48. package/lib/types/elements/gtk-application-window.d.ts +34 -0
  49. package/lib/types/elements/gtk-aspect-frame.d.ts +27 -0
  50. package/lib/types/elements/gtk-button.d.ts +9 -0
  51. package/lib/types/elements/gtk-calendar.d.ts +159 -0
  52. package/lib/types/elements/gtk-center-box.d.ts +39 -0
  53. package/lib/types/elements/gtk-color-dialog-button.d.ts +69 -0
  54. package/lib/types/elements/gtk-column-view.d.ts +50 -0
  55. package/lib/types/elements/gtk-drag-icon.d.ts +78 -0
  56. package/lib/types/elements/gtk-drawing-area.d.ts +95 -0
  57. package/lib/types/elements/gtk-editable-label.d.ts +33 -0
  58. package/lib/types/elements/gtk-emoji-chooser.d.ts +84 -0
  59. package/lib/types/elements/gtk-entry.d.ts +20 -1
  60. package/lib/types/elements/gtk-expander.d.ts +49 -0
  61. package/lib/types/elements/gtk-fixed.d.ts +13 -0
  62. package/lib/types/elements/gtk-flow-box-child.d.ts +14 -0
  63. package/lib/types/elements/gtk-flow-box.d.ts +87 -0
  64. package/lib/types/elements/gtk-font-dialog-button.d.ts +83 -0
  65. package/lib/types/elements/gtk-frame.d.ts +24 -0
  66. package/lib/types/elements/gtk-gl-area.d.ts +136 -0
  67. package/lib/types/elements/gtk-graphics-offload.d.ts +24 -0
  68. package/lib/types/elements/gtk-grid-view.d.ts +39 -0
  69. package/lib/types/elements/gtk-grid.d.ts +27 -0
  70. package/lib/types/elements/gtk-header-bar.d.ts +60 -0
  71. package/lib/types/elements/gtk-inscription.d.ts +64 -0
  72. package/lib/types/elements/gtk-label.d.ts +3 -0
  73. package/lib/types/elements/gtk-level-bar.d.ts +59 -0
  74. package/lib/types/elements/gtk-link-button.d.ts +29 -0
  75. package/lib/types/elements/gtk-list-box-row.d.ts +54 -0
  76. package/lib/types/elements/gtk-list-box.d.ts +100 -0
  77. package/lib/types/elements/gtk-list-view.d.ts +73 -0
  78. package/lib/types/elements/gtk-media-controls.d.ts +142 -0
  79. package/lib/types/elements/gtk-notebook.d.ts +148 -0
  80. package/lib/types/elements/gtk-overlay.d.ts +22 -0
  81. package/lib/types/elements/gtk-page-setup-unix-dialog.d.ts +87 -0
  82. package/lib/types/elements/gtk-paned.d.ts +121 -0
  83. package/lib/types/elements/gtk-password-entry.d.ts +27 -0
  84. package/lib/types/elements/gtk-picture.d.ts +66 -0
  85. package/lib/types/elements/gtk-popover-bin.d.ts +82 -0
  86. package/lib/types/elements/gtk-popover-menu-bar.d.ts +66 -0
  87. package/lib/types/elements/gtk-popover-menu.d.ts +83 -0
  88. package/lib/types/elements/gtk-popover.d.ts +28 -3
  89. package/lib/types/elements/gtk-print-unix-dialog.d.ts +167 -0
  90. package/lib/types/elements/gtk-revealer.d.ts +55 -0
  91. package/lib/types/elements/gtk-scale-button.d.ts +59 -0
  92. package/lib/types/elements/gtk-scale.d.ts +98 -0
  93. package/lib/types/elements/gtk-scrollbar.d.ts +124 -0
  94. package/lib/types/elements/gtk-scrolled-window.d.ts +129 -0
  95. package/lib/types/elements/gtk-search-bar.d.ts +39 -0
  96. package/lib/types/elements/gtk-search-entry.d.ts +27 -0
  97. package/lib/types/elements/gtk-separator.d.ts +10 -0
  98. package/lib/types/elements/gtk-spin-button.d.ts +94 -0
  99. package/lib/types/elements/gtk-spinner.d.ts +14 -0
  100. package/lib/types/elements/gtk-stack-sidebar.d.ts +43 -0
  101. package/lib/types/elements/gtk-stack-switcher.d.ts +58 -0
  102. package/lib/types/elements/gtk-stack.d.ts +154 -0
  103. package/lib/types/elements/gtk-switch.d.ts +4 -1
  104. package/lib/types/elements/gtk-text-view.d.ts +62 -0
  105. package/lib/types/elements/gtk-text.d.ts +45 -0
  106. package/lib/types/elements/gtk-toggle-button.d.ts +45 -0
  107. package/lib/types/elements/gtk-tree-expander.d.ts +38 -0
  108. package/lib/types/elements/gtk-video.d.ts +97 -0
  109. package/lib/types/elements/gtk-viewport.d.ts +84 -0
  110. package/lib/types/elements/gtk-window-controls.d.ts +80 -0
  111. package/lib/types/elements/gtk-window-handle.d.ts +39 -0
  112. package/lib/types/elements/gtk-window.d.ts +103 -0
  113. package/lib/types/elements/justification.d.ts +2 -0
  114. package/lib/types/elements/popover-menu.d.ts +18 -0
  115. package/lib/types/elements/roving-focus.d.ts +29 -1
  116. package/lib/types/emoji-data.d.ts +38 -0
  117. package/lib/types/font-description.d.ts +96 -0
  118. package/lib/types/gtk-about-dialog.spec.d.ts +1 -0
  119. package/lib/types/gtk-action-bar.spec.d.ts +1 -0
  120. package/lib/types/gtk-application-window.spec.d.ts +1 -0
  121. package/lib/types/gtk-aspect-frame.spec.d.ts +1 -0
  122. package/lib/types/gtk-calendar.spec.d.ts +1 -0
  123. package/lib/types/gtk-center-box.spec.d.ts +1 -0
  124. package/lib/types/gtk-color-dialog-button.spec.d.ts +1 -0
  125. package/lib/types/gtk-column-view.spec.d.ts +1 -0
  126. package/lib/types/gtk-drag-icon.spec.d.ts +1 -0
  127. package/lib/types/gtk-drawing-area.spec.d.ts +1 -0
  128. package/lib/types/gtk-editable-label.spec.d.ts +1 -0
  129. package/lib/types/gtk-emoji-chooser.spec.d.ts +1 -0
  130. package/lib/types/gtk-expander.spec.d.ts +1 -0
  131. package/lib/types/gtk-fixed.spec.d.ts +1 -0
  132. package/lib/types/gtk-flow-box.spec.d.ts +1 -0
  133. package/lib/types/gtk-font-dialog-button.spec.d.ts +1 -0
  134. package/lib/types/gtk-frame.spec.d.ts +1 -0
  135. package/lib/types/gtk-gl-area.spec.d.ts +1 -0
  136. package/lib/types/gtk-graphics-offload.spec.d.ts +1 -0
  137. package/lib/types/gtk-grid-view.spec.d.ts +1 -0
  138. package/lib/types/gtk-grid.spec.d.ts +1 -0
  139. package/lib/types/gtk-header-bar.spec.d.ts +1 -0
  140. package/lib/types/gtk-inscription.spec.d.ts +1 -0
  141. package/lib/types/gtk-level-bar.spec.d.ts +1 -0
  142. package/lib/types/gtk-link-button.spec.d.ts +1 -0
  143. package/lib/types/gtk-list-box.spec.d.ts +1 -0
  144. package/lib/types/gtk-list-view.spec.d.ts +1 -0
  145. package/lib/types/gtk-media-controls.spec.d.ts +1 -0
  146. package/lib/types/gtk-notebook.spec.d.ts +1 -0
  147. package/lib/types/gtk-overlay.spec.d.ts +1 -0
  148. package/lib/types/gtk-paned.spec.d.ts +1 -0
  149. package/lib/types/gtk-password-entry.spec.d.ts +1 -0
  150. package/lib/types/gtk-picture.spec.d.ts +1 -0
  151. package/lib/types/gtk-popover-bin.spec.d.ts +1 -0
  152. package/lib/types/gtk-popover-menu-bar.spec.d.ts +1 -0
  153. package/lib/types/gtk-popover-menu.spec.d.ts +1 -0
  154. package/lib/types/gtk-popover-role.spec.d.ts +1 -0
  155. package/lib/types/gtk-popover.spec.d.ts +1 -0
  156. package/lib/types/gtk-print-dialogs.spec.d.ts +1 -0
  157. package/lib/types/gtk-revealer.spec.d.ts +1 -0
  158. package/lib/types/gtk-scale-button.spec.d.ts +1 -0
  159. package/lib/types/gtk-scale.spec.d.ts +1 -0
  160. package/lib/types/gtk-scrollbar.spec.d.ts +1 -0
  161. package/lib/types/gtk-scrolled-window.spec.d.ts +1 -0
  162. package/lib/types/gtk-search-bar.spec.d.ts +1 -0
  163. package/lib/types/gtk-search-entry.spec.d.ts +1 -0
  164. package/lib/types/gtk-separator.spec.d.ts +1 -0
  165. package/lib/types/gtk-spin-button.spec.d.ts +1 -0
  166. package/lib/types/gtk-spinner.spec.d.ts +1 -0
  167. package/lib/types/gtk-stack-sidebar.spec.d.ts +1 -0
  168. package/lib/types/gtk-stack-switcher.spec.d.ts +1 -0
  169. package/lib/types/gtk-stack.spec.d.ts +1 -0
  170. package/lib/types/gtk-text-view.spec.d.ts +1 -0
  171. package/lib/types/gtk-text.spec.d.ts +1 -0
  172. package/lib/types/gtk-toggle-button.spec.d.ts +1 -0
  173. package/lib/types/gtk-tree-expander.spec.d.ts +1 -0
  174. package/lib/types/gtk-video.spec.d.ts +1 -0
  175. package/lib/types/gtk-viewport.spec.d.ts +1 -0
  176. package/lib/types/gtk-window-controls.spec.d.ts +1 -0
  177. package/lib/types/gtk-window-handle.spec.d.ts +1 -0
  178. package/lib/types/gtk-window.spec.d.ts +1 -0
  179. package/lib/types/index.d.ts +4 -1
  180. package/lib/types/list-view-dom.d.ts +44 -0
  181. package/lib/types/namespace/adw.d.ts +12 -0
  182. package/lib/types/namespace/gtk.d.ts +61 -0
  183. package/lib/types/page-setup.d.ts +100 -0
  184. package/lib/types/row-line-clamp.d.ts +20 -0
  185. package/lib/types/row-tooltip.d.ts +8 -0
  186. package/lib/types/row-tooltip.spec.d.ts +1 -0
  187. package/lib/types/scroll-shading.d.ts +15 -1
  188. package/lib/types/shared-tree-builder.d.ts +75 -17
  189. package/lib/types/shared-tree-mount.spec.d.ts +1 -0
  190. package/lib/types/signals.d.ts +4 -0
  191. package/lib/types/styles.generated.d.ts +1 -1
  192. package/lib/types/tab-chip.d.ts +73 -0
  193. package/lib/types/template-classes.d.ts +11 -0
  194. package/lib/types/widget-size.spec.d.ts +1 -0
  195. package/package.json +12 -8
  196. package/scss/_action_row.scss +41 -17
  197. package/scss/_application_window.scss +26 -0
  198. package/scss/_aspect_frame.scss +25 -0
  199. package/scss/_bin.scss +26 -0
  200. package/scss/_button.scss +45 -0
  201. package/scss/_button_row.scss +5 -0
  202. package/scss/_calendar.scss +176 -0
  203. package/scss/_center_box.scss +25 -0
  204. package/scss/_checks.scss +6 -1
  205. package/scss/_clamp_scrollable.scss +28 -0
  206. package/scss/_color_button.scss +67 -0
  207. package/scss/_column_view.scss +126 -0
  208. package/scss/_drag_icon.scss +55 -0
  209. package/scss/_drawing.scss +85 -0
  210. package/scss/_emoji_chooser.scss +213 -0
  211. package/scss/_entry.scss +13 -5
  212. package/scss/_entry_row.scss +1 -1
  213. package/scss/_expander.scss +113 -0
  214. package/scss/_expander_row.scss +36 -3
  215. package/scss/_fixed.scss +29 -0
  216. package/scss/_flow_box.scss +94 -0
  217. package/scss/_font_button.scss +63 -0
  218. package/scss/_frame.scss +41 -0
  219. package/scss/_grid.scss +19 -0
  220. package/scss/_grid_view.scss +46 -0
  221. package/scss/_gtk_about_dialog.scss +186 -0
  222. package/scss/_headerbar.scss +134 -1
  223. package/scss/_icons.generated.scss +186 -0
  224. package/scss/_inscription.scss +125 -0
  225. package/scss/_level_bar.scss +190 -0
  226. package/scss/_link.scss +82 -0
  227. package/scss/_list_box.scss +88 -0
  228. package/scss/_list_view.scss +96 -0
  229. package/scss/_media_controls.scss +139 -0
  230. package/scss/_overlay.scss +68 -0
  231. package/scss/_paned.scss +130 -0
  232. package/scss/_password_entry.scss +83 -0
  233. package/scss/_picture.scss +80 -0
  234. package/scss/_popover_bin.scss +53 -0
  235. package/scss/_popover_menu_bar.scss +104 -0
  236. package/scss/_preferences_row.scss +60 -0
  237. package/scss/_print_dialogs.scss +328 -0
  238. package/scss/_reset.scss +21 -19
  239. package/scss/_revealer.scss +37 -0
  240. package/scss/_row.scss +36 -5
  241. package/scss/_scale.scss +298 -0
  242. package/scss/_scale_button.scss +167 -0
  243. package/scss/_scrollbar.scss +230 -0
  244. package/scss/_scrolled_window.scss +131 -0
  245. package/scss/_search_bar.scss +118 -0
  246. package/scss/_search_entry.scss +86 -0
  247. package/scss/_separator.scss +44 -0
  248. package/scss/_shortcuts_dialog.scss +100 -0
  249. package/scss/_spin_button.scss +172 -0
  250. package/scss/_spin_row.scss +56 -8
  251. package/scss/_spinner.scss +85 -4
  252. package/scss/_stack.scss +729 -0
  253. package/scss/_status_page.scss +1 -1
  254. package/scss/_switch.scss +13 -5
  255. package/scss/_switch_row.scss +10 -0
  256. package/scss/_tab_bar.scss +317 -0
  257. package/scss/_tab_button.scss +98 -0
  258. package/scss/_tab_overview.scss +483 -0
  259. package/scss/_text.scss +182 -0
  260. package/scss/_theme.scss +1 -1
  261. package/scss/_toggle_group.scss +28 -0
  262. package/scss/_tree_expander.scss +62 -0
  263. package/scss/_variables.scss +1 -1
  264. package/scss/_video.scss +146 -0
  265. package/scss/_view_switcher_sidebar.scss +112 -0
  266. package/scss/_viewport.scss +50 -0
  267. package/scss/_widget.scss +14 -3
  268. package/scss/_window.scss +131 -2
  269. package/scss/_window_handle.scss +20 -0
  270. package/scss/adwaita-skin.scss +109 -0
  271. package/src/adw-action-rows.spec.ts +331 -0
  272. package/src/adw-application-window.spec.ts +118 -0
  273. package/src/adw-bin.spec.ts +75 -0
  274. package/src/adw-breakpoint-bin.spec.ts +324 -0
  275. package/src/adw-clamp-scrollable.spec.ts +189 -0
  276. package/src/adw-header-bar.spec.ts +18 -0
  277. package/src/adw-multi-layout-view.spec.ts +243 -0
  278. package/src/adw-preferences-row.spec.ts +164 -0
  279. package/src/adw-row-state.spec.ts +142 -0
  280. package/src/adw-shortcuts.spec.ts +155 -0
  281. package/src/adw-status-page.spec.ts +124 -0
  282. package/src/adw-tab-bar.spec.ts +287 -0
  283. package/src/adw-tab-button.spec.ts +101 -0
  284. package/src/adw-tab-overview.spec.ts +443 -0
  285. package/src/adw-view-switcher-sidebar.spec.ts +281 -0
  286. package/src/adw-window.spec.ts +129 -0
  287. package/src/attributes.ts +52 -0
  288. package/src/breakpoints.ts +25 -8
  289. package/src/capabilities.d.mts +3 -0
  290. package/src/capabilities.mjs +21 -0
  291. package/src/connect-lifecycle.spec.ts +12 -0
  292. package/src/construct-vectors.spec.ts +175 -0
  293. package/src/elements/adw-action-row.ts +31 -2
  294. package/src/elements/adw-alert-dialog.ts +4 -1
  295. package/src/elements/adw-application-window.ts +154 -0
  296. package/src/elements/adw-bin.ts +101 -0
  297. package/src/elements/adw-breakpoint-bin.ts +287 -0
  298. package/src/elements/adw-button-row.ts +7 -1
  299. package/src/elements/adw-clamp-scrollable.ts +207 -0
  300. package/src/elements/adw-combo-row.ts +26 -1
  301. package/src/elements/adw-dialog.ts +19 -0
  302. package/src/elements/adw-entry-row.ts +22 -12
  303. package/src/elements/adw-expander-row.ts +34 -1
  304. package/src/elements/adw-header-bar.ts +18 -4
  305. package/src/elements/adw-layout-slot.ts +95 -0
  306. package/src/elements/adw-multi-layout-view.ts +326 -0
  307. package/src/elements/adw-overlay-split-view.ts +29 -6
  308. package/src/elements/adw-preferences-row.ts +153 -0
  309. package/src/elements/adw-shortcuts-dialog.ts +52 -0
  310. package/src/elements/adw-shortcuts-item.ts +171 -0
  311. package/src/elements/adw-shortcuts-section.ts +86 -0
  312. package/src/elements/adw-sidebar.ts +74 -7
  313. package/src/elements/adw-spin-row.ts +37 -2
  314. package/src/elements/adw-status-page.ts +10 -2
  315. package/src/elements/adw-switch-row.ts +53 -2
  316. package/src/elements/adw-tab-bar.ts +529 -0
  317. package/src/elements/adw-tab-button.ts +194 -0
  318. package/src/elements/adw-tab-overview.ts +1011 -0
  319. package/src/elements/adw-tab-view.ts +66 -145
  320. package/src/elements/adw-toggle-group.ts +138 -14
  321. package/src/elements/adw-view-stack.ts +18 -0
  322. package/src/elements/adw-view-switcher-sidebar.ts +332 -0
  323. package/src/elements/adw-window.ts +190 -11
  324. package/src/elements/checks.ts +35 -8
  325. package/src/elements/gtk-about-dialog.ts +811 -0
  326. package/src/elements/gtk-application-window.ts +108 -0
  327. package/src/elements/gtk-aspect-frame.ts +160 -0
  328. package/src/elements/gtk-button.ts +12 -0
  329. package/src/elements/gtk-calendar.ts +757 -0
  330. package/src/elements/gtk-center-box.ts +184 -0
  331. package/src/elements/gtk-color-dialog-button.ts +278 -0
  332. package/src/elements/gtk-column-view.ts +320 -0
  333. package/src/elements/gtk-drag-icon.ts +257 -0
  334. package/src/elements/gtk-drawing-area.ts +303 -0
  335. package/src/elements/gtk-editable-label.ts +204 -0
  336. package/src/elements/gtk-emoji-chooser.ts +542 -0
  337. package/src/elements/gtk-entry.ts +39 -5
  338. package/src/elements/gtk-expander.ts +301 -0
  339. package/src/elements/gtk-fixed.ts +99 -0
  340. package/src/elements/gtk-flow-box-child.ts +68 -0
  341. package/src/elements/gtk-flow-box.ts +480 -0
  342. package/src/elements/gtk-font-dialog-button.ts +432 -0
  343. package/src/elements/gtk-frame.ts +174 -0
  344. package/src/elements/gtk-gl-area.ts +476 -0
  345. package/src/elements/gtk-graphics-offload.ts +130 -0
  346. package/src/elements/gtk-grid-view.ts +168 -0
  347. package/src/elements/gtk-grid.ts +127 -0
  348. package/src/elements/gtk-header-bar.ts +273 -0
  349. package/src/elements/gtk-inscription.ts +387 -0
  350. package/src/elements/gtk-label.ts +19 -11
  351. package/src/elements/gtk-level-bar.ts +323 -0
  352. package/src/elements/gtk-link-button.ts +138 -0
  353. package/src/elements/gtk-list-box-row.ts +195 -0
  354. package/src/elements/gtk-list-box.ts +413 -0
  355. package/src/elements/gtk-list-view.ts +370 -0
  356. package/src/elements/gtk-media-controls.ts +509 -0
  357. package/src/elements/gtk-notebook.ts +664 -0
  358. package/src/elements/gtk-overlay.ts +149 -0
  359. package/src/elements/gtk-page-setup-unix-dialog.ts +420 -0
  360. package/src/elements/gtk-paned.ts +597 -0
  361. package/src/elements/gtk-password-entry.ts +170 -0
  362. package/src/elements/gtk-picture.ts +254 -0
  363. package/src/elements/gtk-popover-bin.ts +332 -0
  364. package/src/elements/gtk-popover-menu-bar.ts +355 -0
  365. package/src/elements/gtk-popover-menu.ts +339 -0
  366. package/src/elements/gtk-popover.ts +92 -10
  367. package/src/elements/gtk-print-unix-dialog.ts +989 -0
  368. package/src/elements/gtk-progress-bar.ts +24 -11
  369. package/src/elements/gtk-revealer.ts +406 -0
  370. package/src/elements/gtk-scale-button.ts +358 -0
  371. package/src/elements/gtk-scale.ts +492 -0
  372. package/src/elements/gtk-scrollbar.ts +528 -0
  373. package/src/elements/gtk-scrolled-window.ts +653 -0
  374. package/src/elements/gtk-search-bar.ts +200 -0
  375. package/src/elements/gtk-search-entry.ts +172 -0
  376. package/src/elements/gtk-separator.ts +52 -0
  377. package/src/elements/gtk-spin-button.ts +475 -0
  378. package/src/elements/gtk-spinner.ts +126 -0
  379. package/src/elements/gtk-stack-sidebar.ts +212 -0
  380. package/src/elements/gtk-stack-switcher.ts +279 -0
  381. package/src/elements/gtk-stack.ts +748 -0
  382. package/src/elements/gtk-switch.ts +52 -19
  383. package/src/elements/gtk-text-view.ts +290 -0
  384. package/src/elements/gtk-text.ts +219 -0
  385. package/src/elements/gtk-toggle-button.ts +239 -0
  386. package/src/elements/gtk-tree-expander.ts +243 -0
  387. package/src/elements/gtk-video.ts +423 -0
  388. package/src/elements/gtk-viewport.ts +277 -0
  389. package/src/elements/gtk-window-controls.ts +341 -0
  390. package/src/elements/gtk-window-handle.ts +221 -0
  391. package/src/elements/gtk-window.ts +372 -0
  392. package/src/elements/justification.ts +24 -0
  393. package/src/elements/popover-menu.ts +24 -0
  394. package/src/elements/roving-focus.ts +53 -21
  395. package/src/emoji-data.ts +577 -0
  396. package/src/entry-rows.spec.ts +31 -0
  397. package/src/font-description.ts +238 -0
  398. package/src/gtk-about-dialog.spec.ts +250 -0
  399. package/src/gtk-action-bar.spec.ts +89 -0
  400. package/src/gtk-application-window.spec.ts +107 -0
  401. package/src/gtk-aspect-frame.spec.ts +114 -0
  402. package/src/gtk-calendar.spec.ts +589 -0
  403. package/src/gtk-center-box.spec.ts +125 -0
  404. package/src/gtk-color-dialog-button.spec.ts +141 -0
  405. package/src/gtk-column-view.spec.ts +154 -0
  406. package/src/gtk-drag-icon.spec.ts +190 -0
  407. package/src/gtk-drawing-area.spec.ts +211 -0
  408. package/src/gtk-editable-label.spec.ts +190 -0
  409. package/src/gtk-emoji-chooser.spec.ts +173 -0
  410. package/src/gtk-entry.spec.ts +23 -0
  411. package/src/gtk-expander.spec.ts +170 -0
  412. package/src/gtk-fixed.spec.ts +97 -0
  413. package/src/gtk-flow-box.spec.ts +289 -0
  414. package/src/gtk-font-dialog-button.spec.ts +166 -0
  415. package/src/gtk-frame.spec.ts +119 -0
  416. package/src/gtk-gl-area.spec.ts +361 -0
  417. package/src/gtk-graphics-offload.spec.ts +119 -0
  418. package/src/gtk-grid-view.spec.ts +106 -0
  419. package/src/gtk-grid.spec.ts +122 -0
  420. package/src/gtk-header-bar.spec.ts +202 -0
  421. package/src/gtk-inscription.spec.ts +235 -0
  422. package/src/gtk-level-bar.spec.ts +199 -0
  423. package/src/gtk-link-button.spec.ts +117 -0
  424. package/src/gtk-list-box.spec.ts +422 -0
  425. package/src/gtk-list-view.spec.ts +203 -0
  426. package/src/gtk-media-controls.spec.ts +295 -0
  427. package/src/gtk-notebook.spec.ts +546 -0
  428. package/src/gtk-overlay.spec.ts +141 -0
  429. package/src/gtk-paned.spec.ts +267 -0
  430. package/src/gtk-password-entry.spec.ts +150 -0
  431. package/src/gtk-picture.spec.ts +172 -0
  432. package/src/gtk-popover-bin.spec.ts +229 -0
  433. package/src/gtk-popover-menu-bar.spec.ts +296 -0
  434. package/src/gtk-popover-menu.spec.ts +261 -0
  435. package/src/gtk-popover-role.spec.ts +138 -0
  436. package/src/gtk-popover.spec.ts +264 -0
  437. package/src/gtk-print-dialogs.spec.ts +251 -0
  438. package/src/gtk-revealer.spec.ts +164 -0
  439. package/src/gtk-scale-button.spec.ts +218 -0
  440. package/src/gtk-scale.spec.ts +213 -0
  441. package/src/gtk-scrollbar.spec.ts +244 -0
  442. package/src/gtk-scrolled-window.spec.ts +262 -0
  443. package/src/gtk-search-bar.spec.ts +179 -0
  444. package/src/gtk-search-entry.spec.ts +142 -0
  445. package/src/gtk-separator.spec.ts +74 -0
  446. package/src/gtk-spin-button.spec.ts +186 -0
  447. package/src/gtk-spinner.spec.ts +130 -0
  448. package/src/gtk-stack-sidebar.spec.ts +217 -0
  449. package/src/gtk-stack-switcher.spec.ts +249 -0
  450. package/src/gtk-stack.spec.ts +432 -0
  451. package/src/gtk-text-view.spec.ts +189 -0
  452. package/src/gtk-text.spec.ts +163 -0
  453. package/src/gtk-toggle-button.spec.ts +186 -0
  454. package/src/gtk-tree-expander.spec.ts +201 -0
  455. package/src/gtk-video.spec.ts +240 -0
  456. package/src/gtk-viewport.spec.ts +140 -0
  457. package/src/gtk-window-controls.spec.ts +232 -0
  458. package/src/gtk-window-handle.spec.ts +158 -0
  459. package/src/gtk-window.spec.ts +202 -0
  460. package/src/index.ts +9 -1
  461. package/src/keyboard-operable.spec.ts +77 -9
  462. package/src/list-view-dom.ts +121 -0
  463. package/src/namespace/adw.ts +12 -0
  464. package/src/namespace/gtk.ts +61 -0
  465. package/src/page-setup.ts +222 -0
  466. package/src/row-line-clamp.ts +74 -0
  467. package/src/row-tooltip.spec.ts +313 -0
  468. package/src/row-tooltip.ts +52 -0
  469. package/src/scroll-shading.ts +18 -1
  470. package/src/shared-tree-builder.ts +336 -41
  471. package/src/shared-tree-mount.spec.ts +130 -0
  472. package/src/shared-trees.spec.ts +15 -0
  473. package/src/signals.ts +15 -0
  474. package/src/style-classes.spec.ts +9 -8
  475. package/src/styles.generated.ts +1 -1
  476. package/src/tab-chip.ts +200 -0
  477. package/src/template-classes.ts +45 -0
  478. package/src/test.browser.mts +160 -0
  479. package/src/widget-size.spec.ts +117 -0
@@ -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,
@@ -58,6 +64,7 @@ import {
58
64
 
59
65
  import { createGtkImage } from './gtk-image.js';
60
66
  import { attachRovingFocus } from './roving-focus.js';
67
+ import { booleanAttribute } from '../attributes.js';
61
68
 
62
69
  // The sidebar consumes its declared children and drops them from the tree, so a later
63
70
  // `setAttribute` on one cannot find its sidebar with `closest()`. These keep the link —
@@ -69,28 +76,51 @@ const sectionBindings = new WeakMap<AdwSidebarSection, { sidebar: AdwSidebar; sp
69
76
  /** A single sidebar item. Child of <adw-sidebar-section>; consumed at connect time. */
70
77
  export class AdwSidebarItem extends HTMLElement {
71
78
  static get observedAttributes() {
72
- return ['title', 'subtitle', 'icon-name', 'disabled', 'hidden'];
79
+ return [
80
+ 'title',
81
+ 'subtitle',
82
+ 'icon-name',
83
+ 'disabled',
84
+ 'hidden',
85
+ 'enabled',
86
+ 'visible',
87
+ 'needs-attention',
88
+ 'badge-number',
89
+ ];
73
90
  }
74
91
 
75
92
  /**
76
- * `AdwSidebarItem:enabled`, under the GIR name — the `disabled` attribute inverted. The
77
- * property is what lets an authored `enabled: false` reach this item through the
93
+ * `AdwSidebarItem:enabled`, under the GIR name — the `disabled` attribute inverted.
94
+ * The property is what lets an authored `enabled: false` reach this item through the
78
95
  * shared-tree builder, which writes a `false` through the element's own property.
96
+ * Reads both the presence-based `disabled` and value-based `enabled` attributes.
79
97
  */
80
98
  get enabled(): boolean {
99
+ // Value-based `enabled` attribute takes precedence (shared-tree builder writes it).
100
+ const enabledAttr = this.getAttribute('enabled');
101
+ if (enabledAttr !== null) return booleanAttribute(enabledAttr, true);
102
+ // Fall back to presence-based `disabled` attribute.
81
103
  return !this.hasAttribute('disabled');
82
104
  }
83
105
 
84
106
  set enabled(value: boolean) {
107
+ // Write both for compatibility: value-based `enabled` and presence-based `disabled`.
108
+ this.setAttribute('enabled', value ? 'true' : 'false');
85
109
  this.toggleAttribute('disabled', !value);
86
110
  }
87
111
 
88
112
  /** `AdwSidebarItem:visible` — the `hidden` attribute inverted, for the same reason. */
89
113
  get visible(): boolean {
114
+ // Value-based `visible` attribute takes precedence (shared-tree builder writes it).
115
+ const visibleAttr = this.getAttribute('visible');
116
+ if (visibleAttr !== null) return booleanAttribute(visibleAttr, true);
117
+ // Fall back to presence-based `hidden` attribute.
90
118
  return !this.hasAttribute('hidden');
91
119
  }
92
120
 
93
121
  set visible(value: boolean) {
122
+ // Write both for compatibility: value-based `visible` and presence-based `hidden`.
123
+ this.setAttribute('visible', value ? 'true' : 'false');
94
124
  this.toggleAttribute('hidden', !value);
95
125
  }
96
126
 
@@ -103,7 +133,11 @@ export class AdwSidebarItem extends HTMLElement {
103
133
  else if (name === 'subtitle') binding.spec.subtitle = value;
104
134
  else if (name === 'icon-name') binding.spec.iconName = value;
105
135
  else if (name === 'disabled') binding.spec.enabled = newValue === null;
136
+ else if (name === 'enabled') binding.spec.enabled = booleanAttribute(newValue, true);
106
137
  else if (name === 'hidden') binding.spec.visible = newValue === null;
138
+ else if (name === 'visible') binding.spec.visible = booleanAttribute(newValue, true);
139
+ else if (name === 'needs-attention') binding.spec.needsAttention = newValue === null;
140
+ else if (name === 'badge-number') binding.spec.badgeNumber = Number.parseInt(value, 10) || 0;
107
141
 
108
142
  binding.sidebar.refresh();
109
143
  }
@@ -255,8 +289,12 @@ export class AdwSidebar extends HTMLElement {
255
289
  title: itemEl.getAttribute('title') ?? '',
256
290
  subtitle: itemEl.getAttribute('subtitle') ?? '',
257
291
  iconName: itemEl.getAttribute('icon-name') ?? '',
258
- enabled: !itemEl.hasAttribute('disabled'),
259
- visible: !itemEl.hasAttribute('hidden'),
292
+ // Use the element's own property getters, which read both value-based
293
+ // (`enabled`/`visible`) and presence-based (`disabled`/`hidden`) attributes.
294
+ enabled: itemEl.enabled,
295
+ visible: itemEl.visible,
296
+ badgeNumber: Number.parseInt(itemEl.getAttribute('badge-number') ?? '0', 10) || 0,
297
+ needsAttention: itemEl.hasAttribute('needs-attention'),
260
298
  };
261
299
  itemBindings.set(itemEl, { sidebar: this, spec: item });
262
300
  items.push(item);
@@ -391,6 +429,12 @@ export class AdwSidebar extends HTMLElement {
391
429
 
392
430
  row.appendChild(textEl);
393
431
 
432
+ // `update_badge` (adw-view-switcher-sidebar.c:133-181): no attention and no count
433
+ // means NO bin at all, a count means the bin loses `.dot` and gains the label, and
434
+ // a drop back to zero takes the label away and puts `.dot` back. The cap is
435
+ // `> 999`, which is `viewSwitcherBadgeLabel`'s rule, so 999 itself prints.
436
+ row.appendChild(this._createIndicator(item));
437
+
394
438
  // Page mode adds a trailing chevron on every row, the way the boxed-list
395
439
  // AdwActionRow carries a `go-next-symbolic` arrow.
396
440
  row.appendChild(createGtkImage('go-next', 'adw-sidebar-item-arrow'));
@@ -400,6 +444,29 @@ export class AdwSidebar extends HTMLElement {
400
444
  return row;
401
445
  }
402
446
 
447
+ /**
448
+ * The item's INDICATOR bin — C's `AdwBin` with `.indicator`, `.dot` and the
449
+ * optional `.needs-attention`, holding an `AdwFadingLabel`'s worth of text.
450
+ */
451
+ private _createIndicator(item: AdwSidebarItemSpec): HTMLElement {
452
+ const badge = item.badgeNumber ?? 0;
453
+ const attention = item.needsAttention === true;
454
+ const bin = document.createElement('span');
455
+ bin.className = 'indicator';
456
+ // Hidden, not absent: `set_suffix (item, NULL)` in C REMOVES the bin, and the
457
+ // difference is only observable through the suffix property.
458
+ bin.hidden = !attention && badge === 0;
459
+ bin.classList.toggle('dot', badge === 0);
460
+ bin.classList.toggle('needs-attention', attention);
461
+ if (badge > 0) {
462
+ const label = document.createElement('span');
463
+ label.className = 'numeric';
464
+ label.textContent = viewSwitcherBadgeLabel(badge);
465
+ bin.appendChild(label);
466
+ }
467
+ return bin;
468
+ }
469
+
403
470
  private _applyMode(): void {
404
471
  const page = this._state.mode === 'page';
405
472
  this.classList.toggle('page', page);
@@ -24,6 +24,11 @@
24
24
  // `adjustment:` sets the property to a whole new object: an unwritten field takes the
25
25
  // adjustment's own default, not what the row held (`ADJUSTMENT_AUTHORED_VECTORS`).
26
26
  //
27
+ // ATTRIBUTES: `adjustment` (the range, JSON), `value`, `title`, `subtitle`, and
28
+ // `title-lines` / `subtitle-lines` — clamp either label to N lines, `0` = unlimited,
29
+ // the AdwActionRow pspec's sentinel (`@girs/adw-1`, min 0, default 0).
30
+ // `tooltip-text` (`Gtk.Widget:tooltip-text`) — the row's tooltip (`src/row-tooltip.ts`).
31
+
27
32
  // Adapted from Adwaita Web UI Framework (https://github.com/mclellac/adwaita-web).
28
33
  // Copyright (c) 2025 csm. MIT License.
29
34
  // Modifications: Reimplemented as Web Component for @gjsify/adwaita-web;
@@ -34,7 +39,9 @@ import { SpinState, deriveRowLabels, normalizeAdjustment, parseAdjustment } from
34
39
  import type { AdwAdjustment, AdwAdjustmentInput } from '@gjsify/adwaita-core';
35
40
  import { attributeOf } from '@gjsify/adwaita-core/tags';
36
41
 
42
+ import { applyRowTooltip } from '../row-tooltip.js';
37
43
  import { bindSlottedChildren } from '../slotted-children.js';
44
+ import { applyRowLineClamp, parseRowLinesAttribute } from '../row-line-clamp.js';
38
45
 
39
46
  /** `Gtk.Adjustment`'s six properties, as `AdwAdjustmentInput` names them. */
40
47
  const ADJUSTMENT_FIELDS = ['value', 'lower', 'upper', 'stepIncrement', 'pageIncrement', 'pageSize'] as const;
@@ -58,6 +65,10 @@ function authoredAdjustment(node: Node): AdwAdjustmentInput {
58
65
 
59
66
  export class AdwSpinRow extends HTMLElement {
60
67
  private _input!: HTMLInputElement;
68
+ /** The label column — kept for `tooltip-text`, which the browser reads off a PART. */
69
+ private _textEl!: HTMLDivElement;
70
+ /** The −/input/+ box — the other half of the row's surface. */
71
+ private _controlEl!: HTMLDivElement;
61
72
  private _titleEl!: HTMLSpanElement;
62
73
  private _subtitleEl!: HTMLSpanElement;
63
74
  /** The headless adjustment: the range, the clamp and the two signals (ADR 0004, ADR 0047). */
@@ -65,7 +76,7 @@ export class AdwSpinRow extends HTMLElement {
65
76
  private _initialized = false;
66
77
 
67
78
  static get observedAttributes() {
68
- return ['title', 'subtitle', 'value', 'adjustment'];
79
+ return ['title', 'subtitle', 'value', 'adjustment', 'tooltip-text', 'title-lines', 'subtitle-lines'];
69
80
  }
70
81
 
71
82
  get value(): number {
@@ -107,6 +118,7 @@ export class AdwSpinRow extends HTMLElement {
107
118
 
108
119
  const text = document.createElement('div');
109
120
  text.className = 'adw-row-text';
121
+ this._textEl = text;
110
122
  this._titleEl = document.createElement('span');
111
123
  this._titleEl.className = 'adw-row-title';
112
124
  this._subtitleEl = document.createElement('span');
@@ -115,6 +127,7 @@ export class AdwSpinRow extends HTMLElement {
115
127
 
116
128
  const control = document.createElement('div');
117
129
  control.className = 'adw-spin-control';
130
+ this._controlEl = control;
118
131
 
119
132
  const decBtn = document.createElement('button');
120
133
  decBtn.className = 'adw-spin-dec';
@@ -164,7 +177,16 @@ export class AdwSpinRow extends HTMLElement {
164
177
 
165
178
  attributeChangedCallback(name: string, _old: string | null, val: string | null) {
166
179
  if (!this._initialized) return;
167
- if (name === 'title' || name === 'subtitle') {
180
+ if (
181
+ name === 'title' ||
182
+ name === 'subtitle' ||
183
+ name === 'tooltip-text' ||
184
+ // The two `*-lines` attributes are LABEL geometry, not the adjustment: without
185
+ // this branch they fell through to the `setValue` below, so `title-lines="1"`
186
+ // set the numeric value to 1 and clamped nothing.
187
+ name === 'title-lines' ||
188
+ name === 'subtitle-lines'
189
+ ) {
168
190
  this._renderText();
169
191
  return;
170
192
  }
@@ -186,6 +208,19 @@ export class AdwSpinRow extends HTMLElement {
186
208
  this._titleEl.hidden = !labels.titleVisible;
187
209
  this._subtitleEl.textContent = labels.subtitle;
188
210
  this._subtitleEl.hidden = !labels.subtitleVisible;
211
+ applyRowTooltip(this, [this._textEl, this._controlEl]);
212
+ this._applyLineClamping();
213
+ }
214
+
215
+ /** Apply CSS line-clamping based on title-lines/subtitle-lines attributes. */
216
+ private _applyLineClamping(): void {
217
+ applyRowLineClamp({
218
+ titleEl: this._titleEl,
219
+ subtitleEl: this._subtitleEl,
220
+ textContainerEl: this._titleEl.parentElement!,
221
+ getTitleLines: () => parseRowLinesAttribute(this.getAttribute('title-lines')),
222
+ getSubtitleLines: () => parseRowLinesAttribute(this.getAttribute('subtitle-lines')),
223
+ });
189
224
  }
190
225
 
191
226
  /** A stepper press — the interactive path, so it emits `notify::value`. */
@@ -1,9 +1,10 @@
1
1
  // <adw-status-page> — A centered empty/placeholder state: a large symbolic
2
2
  // icon, a title, a description and an optional action (slotted child).
3
3
  // Attributes: icon (symbolic name, with or without -symbolic) or icon-name, the GObject
4
- // spelling a projected `.blp` writes; title, description.
4
+ // spelling a projected `.blp` writes; title, description, and the boolean compact.
5
5
  // Reference: refs/adwaita-web/adwaita-web/scss/_status_page.scss
6
6
  // Reference: refs/libadwaita/src/stylesheet/widgets/_misc.scss (AdwStatusPage)
7
+ // Reference: refs/libadwaita/doc/style-classes.md (Compact Status Page)
7
8
  // Copyright (c) GNOME contributors (libadwaita). LGPLv2.1+.
8
9
  // Modifications: Implemented as a Web Component for @gjsify/adwaita-web; the
9
10
  // icon node is <gtk-image>.
@@ -22,7 +23,7 @@ export class AdwStatusPage extends HTMLElement {
22
23
  private _initialized = false;
23
24
 
24
25
  static get observedAttributes() {
25
- return ['icon', 'icon-name', 'title', 'description'];
26
+ return ['icon', 'icon-name', 'title', 'description', 'compact'];
26
27
  }
27
28
 
28
29
  connectedCallback() {
@@ -64,6 +65,13 @@ export class AdwStatusPage extends HTMLElement {
64
65
  }
65
66
 
66
67
  private _render() {
68
+ // `.compact` (style-classes.md "Compact Status Page") is keyed off the HOST by
69
+ // `_status_page.scss`, so this door writes the class itself. ADDED, never toggled:
70
+ // `shared-tree-builder.ts` puts a `.blp`'s `styles ["compact"]` on this same class,
71
+ // and a `toggle` would strip it on the first attribute change — `title`, on any page
72
+ // that sets one. Additive, the way `gtk_button_add_css_class` is.
73
+ if (this.hasAttribute('compact')) this.classList.add('compact');
74
+
67
75
  const icon = this.getAttribute('icon') ?? this.getAttribute('icon-name');
68
76
  // The element swaps the mask class and keeps the size class.
69
77
  this._iconEl.iconName = icon;
@@ -10,6 +10,14 @@
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
+ //
17
+ // ATTRIBUTES: `title`, `subtitle`, `active`, `tooltip-text` (`Gtk.Widget:tooltip-text`),
18
+ // and `title-lines` / `subtitle-lines` —
19
+ // clamp either label to N lines, `0` = unlimited, the AdwActionRow pspec's sentinel
20
+ // (`@girs/adw-1`, min 0, default 0).
13
21
  // Adapted from Adwaita Web UI Framework (https://github.com/mclellac/adwaita-web).
14
22
  // Copyright (c) 2025 csm. MIT License.
15
23
  // Modifications: Reimplemented as Web Component for @gjsify/adwaita-web;
@@ -18,6 +26,11 @@
18
26
 
19
27
  import { SwitchRowState, deriveRowLabels } from '@gjsify/adwaita-core';
20
28
 
29
+ import { bindEmptySections } from '../empty-sections.js';
30
+ import { applyRowTooltip } from '../row-tooltip.js';
31
+ import { bindSlottedChildren } from '../slotted-children.js';
32
+ import { applyRowLineClamp, parseRowLinesAttribute } from '../row-line-clamp.js';
33
+
21
34
  // SIDE-EFFECT import, deliberately separate from the type import below: it guarantees
22
35
  // `gtk-switch` is defined before this module's `customElements.define` can upgrade a
23
36
  // server-rendered `<adw-switch-row>` and build one. A combined `import { GtkSwitch }`
@@ -30,6 +43,9 @@ import type { GtkSwitch } from './gtk-switch.js';
30
43
 
31
44
  export class AdwSwitchRow extends HTMLElement {
32
45
  private _switchEl!: GtkSwitch;
46
+ private _prefixEl!: HTMLDivElement;
47
+ /** The label column — kept for `tooltip-text`, which the browser reads off a PART. */
48
+ private _textEl!: HTMLDivElement;
33
49
  private _titleEl!: HTMLSpanElement;
34
50
  private _subtitleEl!: HTMLSpanElement;
35
51
  /** The headless active flag + its notify rule (ADR 0004). */
@@ -37,7 +53,12 @@ export class AdwSwitchRow extends HTMLElement {
37
53
  private _initialized = false;
38
54
 
39
55
  static get observedAttributes() {
40
- return ['title', 'subtitle', 'active'];
56
+ return ['title', 'subtitle', 'active', 'tooltip-text', 'title-lines', 'subtitle-lines'];
57
+ }
58
+
59
+ /** The start (prefix) section — append icons/widgets here imperatively. */
60
+ get prefixSection(): HTMLDivElement {
61
+ return this._prefixEl;
41
62
  }
42
63
 
43
64
  get active(): boolean {
@@ -56,17 +77,32 @@ export class AdwSwitchRow extends HTMLElement {
56
77
 
57
78
  const text = document.createElement('div');
58
79
  text.className = 'adw-row-text';
80
+ this._textEl = text;
59
81
  this._titleEl = document.createElement('span');
60
82
  this._titleEl.className = 'adw-row-title';
61
83
  this._subtitleEl = document.createElement('span');
62
84
  this._subtitleEl.className = 'adw-row-subtitle';
63
85
  text.append(this._titleEl, this._subtitleEl);
64
86
 
87
+ this._prefixEl = document.createElement('div');
88
+ this._prefixEl.className = 'adw-switch-row-prefix';
89
+
65
90
  this._switchEl = document.createElement('gtk-switch') as GtkSwitch;
66
91
  // adw-switch-row.c:159 — the slider is not a focus target; the ROW is.
67
92
  this._switchEl.unfocusable = true;
68
93
 
69
- this.replaceChildren(text, this._switchEl);
94
+ // The prefix stays LIVE, as on every other slotted row: an icon appended with
95
+ // `slot="prefix"` after connect has to land where the declared one does.
96
+ // `src/slotted-children.ts` carries the incident.
97
+ bindSlottedChildren(this, [{ name: 'prefix', into: this._prefixEl }]).install(
98
+ this._prefixEl,
99
+ text,
100
+ this._switchEl,
101
+ );
102
+ // Same reason as the action row's: an icon appended into `prefixSection` is a
103
+ // childList change no attribute callback hears, so the section would stay hidden
104
+ // and the icon measure 0x0. AFTER the routing — it derives once synchronously.
105
+ bindEmptySections(this._prefixEl);
70
106
 
71
107
  this._state.setActive(this.hasAttribute('active'));
72
108
  this._switchEl.active = this._state.active;
@@ -133,6 +169,21 @@ export class AdwSwitchRow extends HTMLElement {
133
169
  this._titleEl.hidden = !titleVisible;
134
170
  this._subtitleEl.textContent = subtitle;
135
171
  this._subtitleEl.hidden = !subtitleVisible;
172
+ // The switch is NOT a part here: `unfocusable` and consumer-facing, and a
173
+ // tooltip the consumer put on it has to keep winning over the row's.
174
+ applyRowTooltip(this, [this._prefixEl, this._textEl]);
175
+ this._applyLineClamping();
176
+ }
177
+
178
+ /** Apply CSS line-clamping based on title-lines/subtitle-lines attributes. */
179
+ private _applyLineClamping(): void {
180
+ applyRowLineClamp({
181
+ titleEl: this._titleEl,
182
+ subtitleEl: this._subtitleEl,
183
+ textContainerEl: this._titleEl.parentElement!,
184
+ getTitleLines: () => parseRowLinesAttribute(this.getAttribute('title-lines')),
185
+ getSubtitleLines: () => parseRowLinesAttribute(this.getAttribute('subtitle-lines')),
186
+ });
136
187
  }
137
188
  }
138
189