@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.
- package/dist/adwaita-web.css +8070 -3037
- package/dist/adwaita-web.css.map +1 -1
- package/lib/types/adw-application-window.spec.d.ts +1 -0
- package/lib/types/adw-bin.spec.d.ts +1 -0
- package/lib/types/adw-breakpoint-bin.spec.d.ts +1 -0
- package/lib/types/adw-clamp-scrollable.spec.d.ts +1 -0
- package/lib/types/adw-multi-layout-view.spec.d.ts +1 -0
- package/lib/types/adw-preferences-row.spec.d.ts +1 -0
- package/lib/types/adw-shortcuts.spec.d.ts +1 -0
- package/lib/types/adw-tab-bar.spec.d.ts +1 -0
- package/lib/types/adw-tab-button.spec.d.ts +1 -0
- package/lib/types/adw-tab-overview.spec.d.ts +1 -0
- package/lib/types/adw-view-switcher-sidebar.spec.d.ts +1 -0
- package/lib/types/adw-window.spec.d.ts +1 -0
- package/lib/types/breakpoints.d.ts +14 -3
- package/lib/types/construct-vectors.spec.d.ts +1 -0
- package/lib/types/elements/adw-application-window.d.ts +27 -0
- package/lib/types/elements/adw-bin.d.ts +17 -0
- package/lib/types/elements/adw-breakpoint-bin.d.ts +67 -0
- package/lib/types/elements/adw-clamp-scrollable.d.ts +38 -0
- package/lib/types/elements/adw-dialog.d.ts +10 -0
- package/lib/types/elements/adw-layout-slot.d.ts +19 -0
- package/lib/types/elements/adw-multi-layout-view.d.ts +101 -0
- package/lib/types/elements/adw-preferences-row.d.ts +31 -0
- package/lib/types/elements/adw-shortcuts-dialog.d.ts +13 -0
- package/lib/types/elements/adw-shortcuts-item.d.ts +36 -0
- package/lib/types/elements/adw-shortcuts-section.d.ts +14 -0
- package/lib/types/elements/adw-sidebar.d.ts +5 -0
- package/lib/types/elements/adw-switch-row.d.ts +3 -0
- package/lib/types/elements/adw-tab-bar.d.ts +108 -0
- package/lib/types/elements/adw-tab-button.d.ts +32 -0
- package/lib/types/elements/adw-tab-overview.d.ts +199 -0
- package/lib/types/elements/adw-tab-view.d.ts +19 -23
- package/lib/types/elements/adw-view-switcher-sidebar.d.ts +84 -0
- package/lib/types/elements/adw-window.d.ts +40 -0
- package/lib/types/elements/gtk-about-dialog.d.ts +146 -0
- package/lib/types/elements/gtk-application-window.d.ts +34 -0
- package/lib/types/elements/gtk-aspect-frame.d.ts +27 -0
- package/lib/types/elements/gtk-button.d.ts +9 -0
- package/lib/types/elements/gtk-calendar.d.ts +159 -0
- package/lib/types/elements/gtk-center-box.d.ts +39 -0
- package/lib/types/elements/gtk-color-dialog-button.d.ts +69 -0
- package/lib/types/elements/gtk-column-view.d.ts +50 -0
- package/lib/types/elements/gtk-drag-icon.d.ts +78 -0
- package/lib/types/elements/gtk-drawing-area.d.ts +95 -0
- package/lib/types/elements/gtk-editable-label.d.ts +33 -0
- package/lib/types/elements/gtk-emoji-chooser.d.ts +84 -0
- package/lib/types/elements/gtk-entry.d.ts +20 -1
- package/lib/types/elements/gtk-expander.d.ts +49 -0
- package/lib/types/elements/gtk-fixed.d.ts +13 -0
- package/lib/types/elements/gtk-flow-box-child.d.ts +14 -0
- package/lib/types/elements/gtk-flow-box.d.ts +87 -0
- package/lib/types/elements/gtk-font-dialog-button.d.ts +83 -0
- package/lib/types/elements/gtk-frame.d.ts +24 -0
- package/lib/types/elements/gtk-gl-area.d.ts +136 -0
- package/lib/types/elements/gtk-graphics-offload.d.ts +24 -0
- package/lib/types/elements/gtk-grid-view.d.ts +39 -0
- package/lib/types/elements/gtk-grid.d.ts +27 -0
- package/lib/types/elements/gtk-header-bar.d.ts +60 -0
- package/lib/types/elements/gtk-inscription.d.ts +64 -0
- package/lib/types/elements/gtk-label.d.ts +3 -0
- package/lib/types/elements/gtk-level-bar.d.ts +59 -0
- package/lib/types/elements/gtk-link-button.d.ts +29 -0
- package/lib/types/elements/gtk-list-box-row.d.ts +54 -0
- package/lib/types/elements/gtk-list-box.d.ts +100 -0
- package/lib/types/elements/gtk-list-view.d.ts +73 -0
- package/lib/types/elements/gtk-media-controls.d.ts +142 -0
- package/lib/types/elements/gtk-notebook.d.ts +148 -0
- package/lib/types/elements/gtk-overlay.d.ts +22 -0
- package/lib/types/elements/gtk-page-setup-unix-dialog.d.ts +87 -0
- package/lib/types/elements/gtk-paned.d.ts +121 -0
- package/lib/types/elements/gtk-password-entry.d.ts +27 -0
- package/lib/types/elements/gtk-picture.d.ts +66 -0
- package/lib/types/elements/gtk-popover-bin.d.ts +82 -0
- package/lib/types/elements/gtk-popover-menu-bar.d.ts +66 -0
- package/lib/types/elements/gtk-popover-menu.d.ts +83 -0
- package/lib/types/elements/gtk-popover.d.ts +28 -3
- package/lib/types/elements/gtk-print-unix-dialog.d.ts +167 -0
- package/lib/types/elements/gtk-revealer.d.ts +55 -0
- package/lib/types/elements/gtk-scale-button.d.ts +59 -0
- package/lib/types/elements/gtk-scale.d.ts +98 -0
- package/lib/types/elements/gtk-scrollbar.d.ts +124 -0
- package/lib/types/elements/gtk-scrolled-window.d.ts +121 -0
- package/lib/types/elements/gtk-search-bar.d.ts +39 -0
- package/lib/types/elements/gtk-search-entry.d.ts +27 -0
- package/lib/types/elements/gtk-separator.d.ts +10 -0
- package/lib/types/elements/gtk-spin-button.d.ts +94 -0
- package/lib/types/elements/gtk-spinner.d.ts +14 -0
- package/lib/types/elements/gtk-stack-sidebar.d.ts +43 -0
- package/lib/types/elements/gtk-stack-switcher.d.ts +58 -0
- package/lib/types/elements/gtk-stack.d.ts +154 -0
- package/lib/types/elements/gtk-switch.d.ts +4 -1
- package/lib/types/elements/gtk-text-view.d.ts +62 -0
- package/lib/types/elements/gtk-text.d.ts +45 -0
- package/lib/types/elements/gtk-toggle-button.d.ts +45 -0
- package/lib/types/elements/gtk-tree-expander.d.ts +38 -0
- package/lib/types/elements/gtk-video.d.ts +97 -0
- package/lib/types/elements/gtk-viewport.d.ts +84 -0
- package/lib/types/elements/gtk-window-controls.d.ts +80 -0
- package/lib/types/elements/gtk-window-handle.d.ts +39 -0
- package/lib/types/elements/gtk-window.d.ts +97 -0
- package/lib/types/elements/justification.d.ts +2 -0
- package/lib/types/elements/popover-menu.d.ts +18 -0
- package/lib/types/elements/roving-focus.d.ts +29 -1
- package/lib/types/emoji-data.d.ts +38 -0
- package/lib/types/font-description.d.ts +96 -0
- package/lib/types/gtk-about-dialog.spec.d.ts +1 -0
- package/lib/types/gtk-action-bar.spec.d.ts +1 -0
- package/lib/types/gtk-application-window.spec.d.ts +1 -0
- package/lib/types/gtk-aspect-frame.spec.d.ts +1 -0
- package/lib/types/gtk-calendar.spec.d.ts +1 -0
- package/lib/types/gtk-center-box.spec.d.ts +1 -0
- package/lib/types/gtk-color-dialog-button.spec.d.ts +1 -0
- package/lib/types/gtk-column-view.spec.d.ts +1 -0
- package/lib/types/gtk-drag-icon.spec.d.ts +1 -0
- package/lib/types/gtk-drawing-area.spec.d.ts +1 -0
- package/lib/types/gtk-editable-label.spec.d.ts +1 -0
- package/lib/types/gtk-emoji-chooser.spec.d.ts +1 -0
- package/lib/types/gtk-expander.spec.d.ts +1 -0
- package/lib/types/gtk-fixed.spec.d.ts +1 -0
- package/lib/types/gtk-flow-box.spec.d.ts +1 -0
- package/lib/types/gtk-font-dialog-button.spec.d.ts +1 -0
- package/lib/types/gtk-frame.spec.d.ts +1 -0
- package/lib/types/gtk-gl-area.spec.d.ts +1 -0
- package/lib/types/gtk-graphics-offload.spec.d.ts +1 -0
- package/lib/types/gtk-grid-view.spec.d.ts +1 -0
- package/lib/types/gtk-grid.spec.d.ts +1 -0
- package/lib/types/gtk-header-bar.spec.d.ts +1 -0
- package/lib/types/gtk-inscription.spec.d.ts +1 -0
- package/lib/types/gtk-level-bar.spec.d.ts +1 -0
- package/lib/types/gtk-link-button.spec.d.ts +1 -0
- package/lib/types/gtk-list-box.spec.d.ts +1 -0
- package/lib/types/gtk-list-view.spec.d.ts +1 -0
- package/lib/types/gtk-media-controls.spec.d.ts +1 -0
- package/lib/types/gtk-notebook.spec.d.ts +1 -0
- package/lib/types/gtk-overlay.spec.d.ts +1 -0
- package/lib/types/gtk-paned.spec.d.ts +1 -0
- package/lib/types/gtk-password-entry.spec.d.ts +1 -0
- package/lib/types/gtk-picture.spec.d.ts +1 -0
- package/lib/types/gtk-popover-bin.spec.d.ts +1 -0
- package/lib/types/gtk-popover-menu-bar.spec.d.ts +1 -0
- package/lib/types/gtk-popover-menu.spec.d.ts +1 -0
- package/lib/types/gtk-popover-role.spec.d.ts +1 -0
- package/lib/types/gtk-popover.spec.d.ts +1 -0
- package/lib/types/gtk-print-dialogs.spec.d.ts +1 -0
- package/lib/types/gtk-revealer.spec.d.ts +1 -0
- package/lib/types/gtk-scale-button.spec.d.ts +1 -0
- package/lib/types/gtk-scale.spec.d.ts +1 -0
- package/lib/types/gtk-scrollbar.spec.d.ts +1 -0
- package/lib/types/gtk-scrolled-window.spec.d.ts +1 -0
- package/lib/types/gtk-search-bar.spec.d.ts +1 -0
- package/lib/types/gtk-search-entry.spec.d.ts +1 -0
- package/lib/types/gtk-separator.spec.d.ts +1 -0
- package/lib/types/gtk-spin-button.spec.d.ts +1 -0
- package/lib/types/gtk-spinner.spec.d.ts +1 -0
- package/lib/types/gtk-stack-sidebar.spec.d.ts +1 -0
- package/lib/types/gtk-stack-switcher.spec.d.ts +1 -0
- package/lib/types/gtk-stack.spec.d.ts +1 -0
- package/lib/types/gtk-text-view.spec.d.ts +1 -0
- package/lib/types/gtk-text.spec.d.ts +1 -0
- package/lib/types/gtk-toggle-button.spec.d.ts +1 -0
- package/lib/types/gtk-tree-expander.spec.d.ts +1 -0
- package/lib/types/gtk-video.spec.d.ts +1 -0
- package/lib/types/gtk-viewport.spec.d.ts +1 -0
- package/lib/types/gtk-window-controls.spec.d.ts +1 -0
- package/lib/types/gtk-window-handle.spec.d.ts +1 -0
- package/lib/types/gtk-window.spec.d.ts +1 -0
- package/lib/types/index.d.ts +4 -1
- package/lib/types/list-view-dom.d.ts +44 -0
- package/lib/types/namespace/adw.d.ts +12 -0
- package/lib/types/namespace/gtk.d.ts +61 -0
- package/lib/types/page-setup.d.ts +100 -0
- package/lib/types/scroll-shading.d.ts +15 -1
- package/lib/types/shared-tree-builder.d.ts +30 -2
- package/lib/types/signals.d.ts +4 -0
- package/lib/types/styles.generated.d.ts +1 -1
- package/lib/types/tab-chip.d.ts +73 -0
- package/lib/types/template-classes.d.ts +11 -0
- package/package.json +12 -8
- package/scss/_action_row.scss +2 -2
- package/scss/_application_window.scss +26 -0
- package/scss/_aspect_frame.scss +25 -0
- package/scss/_bin.scss +26 -0
- package/scss/_button.scss +45 -0
- package/scss/_calendar.scss +176 -0
- package/scss/_center_box.scss +25 -0
- package/scss/_checks.scss +6 -1
- package/scss/_clamp_scrollable.scss +28 -0
- package/scss/_color_button.scss +67 -0
- package/scss/_column_view.scss +126 -0
- package/scss/_drag_icon.scss +55 -0
- package/scss/_drawing.scss +85 -0
- package/scss/_emoji_chooser.scss +213 -0
- package/scss/_entry.scss +13 -5
- package/scss/_entry_row.scss +1 -1
- package/scss/_expander.scss +113 -0
- package/scss/_fixed.scss +29 -0
- package/scss/_flow_box.scss +94 -0
- package/scss/_font_button.scss +63 -0
- package/scss/_frame.scss +41 -0
- package/scss/_grid.scss +19 -0
- package/scss/_grid_view.scss +46 -0
- package/scss/_gtk_about_dialog.scss +186 -0
- package/scss/_headerbar.scss +132 -0
- package/scss/_icons.generated.scss +186 -0
- package/scss/_inscription.scss +125 -0
- package/scss/_level_bar.scss +190 -0
- package/scss/_link.scss +82 -0
- package/scss/_list_box.scss +88 -0
- package/scss/_list_view.scss +96 -0
- package/scss/_media_controls.scss +139 -0
- package/scss/_overlay.scss +68 -0
- package/scss/_paned.scss +130 -0
- package/scss/_password_entry.scss +83 -0
- package/scss/_picture.scss +80 -0
- package/scss/_popover_bin.scss +53 -0
- package/scss/_popover_menu_bar.scss +104 -0
- package/scss/_preferences_row.scss +51 -0
- package/scss/_print_dialogs.scss +328 -0
- package/scss/_reset.scss +21 -19
- package/scss/_revealer.scss +37 -0
- package/scss/_row.scss +20 -5
- package/scss/_scale.scss +298 -0
- package/scss/_scale_button.scss +167 -0
- package/scss/_scrollbar.scss +230 -0
- package/scss/_scrolled_window.scss +131 -0
- package/scss/_search_bar.scss +118 -0
- package/scss/_search_entry.scss +86 -0
- package/scss/_separator.scss +44 -0
- package/scss/_shortcuts_dialog.scss +100 -0
- package/scss/_spin_button.scss +172 -0
- package/scss/_spin_row.scss +56 -8
- package/scss/_spinner.scss +85 -4
- package/scss/_stack.scss +729 -0
- package/scss/_switch.scss +13 -5
- package/scss/_switch_row.scss +10 -0
- package/scss/_tab_bar.scss +317 -0
- package/scss/_tab_button.scss +98 -0
- package/scss/_tab_overview.scss +483 -0
- package/scss/_text.scss +182 -0
- package/scss/_theme.scss +1 -1
- package/scss/_tree_expander.scss +62 -0
- package/scss/_variables.scss +43 -21
- package/scss/_video.scss +146 -0
- package/scss/_view_switcher_sidebar.scss +112 -0
- package/scss/_viewport.scss +50 -0
- package/scss/_window.scss +118 -1
- package/scss/_window_handle.scss +20 -0
- package/scss/adwaita-skin.scss +109 -0
- package/src/adw-action-rows.spec.ts +76 -0
- package/src/adw-application-window.spec.ts +118 -0
- package/src/adw-bin.spec.ts +75 -0
- package/src/adw-breakpoint-bin.spec.ts +324 -0
- package/src/adw-clamp-scrollable.spec.ts +189 -0
- package/src/adw-multi-layout-view.spec.ts +243 -0
- package/src/adw-preferences-row.spec.ts +164 -0
- package/src/adw-row-state.spec.ts +142 -0
- package/src/adw-shortcuts.spec.ts +155 -0
- package/src/adw-tab-bar.spec.ts +287 -0
- package/src/adw-tab-button.spec.ts +101 -0
- package/src/adw-tab-overview.spec.ts +443 -0
- package/src/adw-view-switcher-sidebar.spec.ts +281 -0
- package/src/adw-window.spec.ts +129 -0
- package/src/breakpoints.ts +25 -8
- package/src/capabilities.d.mts +3 -0
- package/src/capabilities.mjs +18 -0
- package/src/connect-lifecycle.spec.ts +12 -0
- package/src/construct-vectors.spec.ts +175 -0
- package/src/elements/adw-application-window.ts +154 -0
- package/src/elements/adw-bin.ts +101 -0
- package/src/elements/adw-breakpoint-bin.ts +287 -0
- package/src/elements/adw-clamp-scrollable.ts +207 -0
- package/src/elements/adw-dialog.ts +19 -0
- package/src/elements/adw-layout-slot.ts +95 -0
- package/src/elements/adw-multi-layout-view.ts +326 -0
- package/src/elements/adw-preferences-row.ts +150 -0
- package/src/elements/adw-shortcuts-dialog.ts +52 -0
- package/src/elements/adw-shortcuts-item.ts +171 -0
- package/src/elements/adw-shortcuts-section.ts +86 -0
- package/src/elements/adw-sidebar.ts +42 -3
- package/src/elements/adw-switch-row.ts +28 -1
- package/src/elements/adw-tab-bar.ts +529 -0
- package/src/elements/adw-tab-button.ts +194 -0
- package/src/elements/adw-tab-overview.ts +1011 -0
- package/src/elements/adw-tab-view.ts +66 -145
- package/src/elements/adw-toggle-group.ts +20 -5
- package/src/elements/adw-view-stack.ts +18 -0
- package/src/elements/adw-view-switcher-sidebar.ts +332 -0
- package/src/elements/adw-window.ts +185 -11
- package/src/elements/checks.ts +35 -8
- package/src/elements/gtk-about-dialog.ts +811 -0
- package/src/elements/gtk-application-window.ts +108 -0
- package/src/elements/gtk-aspect-frame.ts +160 -0
- package/src/elements/gtk-button.ts +12 -0
- package/src/elements/gtk-calendar.ts +757 -0
- package/src/elements/gtk-center-box.ts +184 -0
- package/src/elements/gtk-color-dialog-button.ts +278 -0
- package/src/elements/gtk-column-view.ts +320 -0
- package/src/elements/gtk-drag-icon.ts +257 -0
- package/src/elements/gtk-drawing-area.ts +303 -0
- package/src/elements/gtk-editable-label.ts +204 -0
- package/src/elements/gtk-emoji-chooser.ts +542 -0
- package/src/elements/gtk-entry.ts +39 -5
- package/src/elements/gtk-expander.ts +301 -0
- package/src/elements/gtk-fixed.ts +99 -0
- package/src/elements/gtk-flow-box-child.ts +68 -0
- package/src/elements/gtk-flow-box.ts +480 -0
- package/src/elements/gtk-font-dialog-button.ts +432 -0
- package/src/elements/gtk-frame.ts +174 -0
- package/src/elements/gtk-gl-area.ts +476 -0
- package/src/elements/gtk-graphics-offload.ts +130 -0
- package/src/elements/gtk-grid-view.ts +168 -0
- package/src/elements/gtk-grid.ts +127 -0
- package/src/elements/gtk-header-bar.ts +273 -0
- package/src/elements/gtk-inscription.ts +387 -0
- package/src/elements/gtk-label.ts +19 -11
- package/src/elements/gtk-level-bar.ts +323 -0
- package/src/elements/gtk-link-button.ts +138 -0
- package/src/elements/gtk-list-box-row.ts +195 -0
- package/src/elements/gtk-list-box.ts +413 -0
- package/src/elements/gtk-list-view.ts +370 -0
- package/src/elements/gtk-media-controls.ts +509 -0
- package/src/elements/gtk-notebook.ts +664 -0
- package/src/elements/gtk-overlay.ts +149 -0
- package/src/elements/gtk-page-setup-unix-dialog.ts +420 -0
- package/src/elements/gtk-paned.ts +597 -0
- package/src/elements/gtk-password-entry.ts +170 -0
- package/src/elements/gtk-picture.ts +254 -0
- package/src/elements/gtk-popover-bin.ts +332 -0
- package/src/elements/gtk-popover-menu-bar.ts +355 -0
- package/src/elements/gtk-popover-menu.ts +339 -0
- package/src/elements/gtk-popover.ts +92 -10
- package/src/elements/gtk-print-unix-dialog.ts +989 -0
- package/src/elements/gtk-progress-bar.ts +24 -11
- package/src/elements/gtk-revealer.ts +406 -0
- package/src/elements/gtk-scale-button.ts +358 -0
- package/src/elements/gtk-scale.ts +492 -0
- package/src/elements/gtk-scrollbar.ts +528 -0
- package/src/elements/gtk-scrolled-window.ts +642 -0
- package/src/elements/gtk-search-bar.ts +200 -0
- package/src/elements/gtk-search-entry.ts +172 -0
- package/src/elements/gtk-separator.ts +52 -0
- package/src/elements/gtk-spin-button.ts +475 -0
- package/src/elements/gtk-spinner.ts +126 -0
- package/src/elements/gtk-stack-sidebar.ts +212 -0
- package/src/elements/gtk-stack-switcher.ts +279 -0
- package/src/elements/gtk-stack.ts +748 -0
- package/src/elements/gtk-switch.ts +52 -19
- package/src/elements/gtk-text-view.ts +290 -0
- package/src/elements/gtk-text.ts +219 -0
- package/src/elements/gtk-toggle-button.ts +239 -0
- package/src/elements/gtk-tree-expander.ts +243 -0
- package/src/elements/gtk-video.ts +423 -0
- package/src/elements/gtk-viewport.ts +277 -0
- package/src/elements/gtk-window-controls.ts +341 -0
- package/src/elements/gtk-window-handle.ts +221 -0
- package/src/elements/gtk-window.ts +366 -0
- package/src/elements/justification.ts +24 -0
- package/src/elements/popover-menu.ts +24 -0
- package/src/elements/roving-focus.ts +53 -21
- package/src/emoji-data.ts +577 -0
- package/src/entry-rows.spec.ts +31 -0
- package/src/font-description.ts +238 -0
- package/src/gtk-about-dialog.spec.ts +250 -0
- package/src/gtk-action-bar.spec.ts +89 -0
- package/src/gtk-application-window.spec.ts +107 -0
- package/src/gtk-aspect-frame.spec.ts +114 -0
- package/src/gtk-calendar.spec.ts +589 -0
- package/src/gtk-center-box.spec.ts +125 -0
- package/src/gtk-color-dialog-button.spec.ts +141 -0
- package/src/gtk-column-view.spec.ts +154 -0
- package/src/gtk-drag-icon.spec.ts +190 -0
- package/src/gtk-drawing-area.spec.ts +211 -0
- package/src/gtk-editable-label.spec.ts +190 -0
- package/src/gtk-emoji-chooser.spec.ts +173 -0
- package/src/gtk-entry.spec.ts +23 -0
- package/src/gtk-expander.spec.ts +170 -0
- package/src/gtk-fixed.spec.ts +97 -0
- package/src/gtk-flow-box.spec.ts +289 -0
- package/src/gtk-font-dialog-button.spec.ts +166 -0
- package/src/gtk-frame.spec.ts +119 -0
- package/src/gtk-gl-area.spec.ts +361 -0
- package/src/gtk-graphics-offload.spec.ts +119 -0
- package/src/gtk-grid-view.spec.ts +106 -0
- package/src/gtk-grid.spec.ts +122 -0
- package/src/gtk-header-bar.spec.ts +202 -0
- package/src/gtk-inscription.spec.ts +235 -0
- package/src/gtk-level-bar.spec.ts +199 -0
- package/src/gtk-link-button.spec.ts +117 -0
- package/src/gtk-list-box.spec.ts +422 -0
- package/src/gtk-list-view.spec.ts +203 -0
- package/src/gtk-media-controls.spec.ts +295 -0
- package/src/gtk-notebook.spec.ts +546 -0
- package/src/gtk-overlay.spec.ts +141 -0
- package/src/gtk-paned.spec.ts +267 -0
- package/src/gtk-password-entry.spec.ts +150 -0
- package/src/gtk-picture.spec.ts +172 -0
- package/src/gtk-popover-bin.spec.ts +229 -0
- package/src/gtk-popover-menu-bar.spec.ts +296 -0
- package/src/gtk-popover-menu.spec.ts +261 -0
- package/src/gtk-popover-role.spec.ts +138 -0
- package/src/gtk-popover.spec.ts +264 -0
- package/src/gtk-print-dialogs.spec.ts +251 -0
- package/src/gtk-revealer.spec.ts +164 -0
- package/src/gtk-scale-button.spec.ts +218 -0
- package/src/gtk-scale.spec.ts +213 -0
- package/src/gtk-scrollbar.spec.ts +244 -0
- package/src/gtk-scrolled-window.spec.ts +262 -0
- package/src/gtk-search-bar.spec.ts +179 -0
- package/src/gtk-search-entry.spec.ts +142 -0
- package/src/gtk-separator.spec.ts +74 -0
- package/src/gtk-spin-button.spec.ts +186 -0
- package/src/gtk-spinner.spec.ts +130 -0
- package/src/gtk-stack-sidebar.spec.ts +217 -0
- package/src/gtk-stack-switcher.spec.ts +249 -0
- package/src/gtk-stack.spec.ts +432 -0
- package/src/gtk-text-view.spec.ts +189 -0
- package/src/gtk-text.spec.ts +163 -0
- package/src/gtk-toggle-button.spec.ts +186 -0
- package/src/gtk-tree-expander.spec.ts +201 -0
- package/src/gtk-video.spec.ts +240 -0
- package/src/gtk-viewport.spec.ts +140 -0
- package/src/gtk-window-controls.spec.ts +232 -0
- package/src/gtk-window-handle.spec.ts +158 -0
- package/src/gtk-window.spec.ts +190 -0
- package/src/index.ts +9 -1
- package/src/keyboard-operable.spec.ts +33 -1
- package/src/list-view-dom.ts +121 -0
- package/src/namespace/adw.ts +12 -0
- package/src/namespace/gtk.ts +61 -0
- package/src/page-setup.ts +222 -0
- package/src/scroll-shading.ts +18 -1
- package/src/shared-tree-builder.ts +263 -21
- package/src/signals.ts +15 -0
- package/src/source-view/theme.ts +11 -5
- package/src/style-classes.spec.ts +9 -8
- package/src/styles.generated.ts +1 -1
- package/src/tab-chip.ts +200 -0
- package/src/template-classes.ts +45 -0
- package/src/test.browser.mts +152 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-graphics-offload>. The passthrough itself is the platform's
|
|
2
|
+
// and cannot be observed from a test — what CAN be is everything the widget does around
|
|
3
|
+
// it: the enum and its default, the early-return guard, the black rectangle, and the bin
|
|
4
|
+
// layout the child is given.
|
|
5
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
6
|
+
|
|
7
|
+
import type { GtkGraphicsOffload } from './elements/gtk-graphics-offload.js';
|
|
8
|
+
|
|
9
|
+
function mount(attrs: Record<string, string> = {}, child?: string): { el: GtkGraphicsOffload; host: HTMLElement } {
|
|
10
|
+
const host = document.createElement('div');
|
|
11
|
+
document.body.appendChild(host);
|
|
12
|
+
const el = document.createElement('gtk-graphics-offload') as GtkGraphicsOffload;
|
|
13
|
+
if (child !== undefined) el.innerHTML = child;
|
|
14
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
15
|
+
host.appendChild(el);
|
|
16
|
+
return { el, host };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const GtkGraphicsOffloadTest = async () => {
|
|
20
|
+
await describe('<gtk-graphics-offload> properties', async () => {
|
|
21
|
+
await it('starts enabled, with no black background and no child', () => {
|
|
22
|
+
// gtkgraphicsoffload.c:107-109 (`self->enabled = GTK_GRAPHICS_OFFLOAD_ENABLED`),
|
|
23
|
+
// :279 (black-background defaults FALSE), and `child` is NULL until set.
|
|
24
|
+
const { el, host } = mount();
|
|
25
|
+
expect(el.enabled).toBe('enabled');
|
|
26
|
+
expect(el.blackBackground).toBe(false);
|
|
27
|
+
expect(el.child).toBe(null);
|
|
28
|
+
host.remove();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
await it('notifies once per real change, and never for an echo', () => {
|
|
32
|
+
// :369 — `if (priv->enabled == enabled) return;` — the same for black-background
|
|
33
|
+
// at :424.
|
|
34
|
+
const { el, host } = mount();
|
|
35
|
+
const enabled: unknown[] = [];
|
|
36
|
+
const black: unknown[] = [];
|
|
37
|
+
el.addEventListener('notify::enabled', (event) => enabled.push((event as CustomEvent).detail['enabled']));
|
|
38
|
+
el.addEventListener('notify::black-background', (event) =>
|
|
39
|
+
black.push((event as CustomEvent).detail['black-background']),
|
|
40
|
+
);
|
|
41
|
+
el.enabled = 'enabled';
|
|
42
|
+
el.blackBackground = false;
|
|
43
|
+
expect(enabled).toStrictEqual([]);
|
|
44
|
+
expect(black).toStrictEqual([]);
|
|
45
|
+
el.enabled = 'disabled';
|
|
46
|
+
el.blackBackground = true;
|
|
47
|
+
expect(enabled).toStrictEqual(['disabled']);
|
|
48
|
+
expect(black).toStrictEqual([true]);
|
|
49
|
+
host.remove();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
await it('reads both properties as attributes', () => {
|
|
53
|
+
const { el, host } = mount({ enabled: 'disabled', 'black-background': '' });
|
|
54
|
+
expect(el.enabled).toBe('disabled');
|
|
55
|
+
expect(el.blackBackground).toBe(true);
|
|
56
|
+
// Anything that is not `disabled` is the GIR default, as `enabled`'s setter is.
|
|
57
|
+
expect(el.getAttribute('enabled')).toBe('disabled');
|
|
58
|
+
host.remove();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await it('takes the black rectangle over the whole allocation', () => {
|
|
62
|
+
// :213-233 — `gtk_snapshot_append_color (… GDK_RGBA_BLACK …)` before the child.
|
|
63
|
+
const { el, host } = mount();
|
|
64
|
+
expect(el.style.backgroundColor).toBe('');
|
|
65
|
+
el.blackBackground = true;
|
|
66
|
+
expect(el.style.backgroundColor).toBe('rgb(0, 0, 0)');
|
|
67
|
+
el.blackBackground = false;
|
|
68
|
+
expect(el.style.backgroundColor).toBe('');
|
|
69
|
+
host.remove();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await it('drops the compositor hint when offload is disabled', () => {
|
|
73
|
+
// `sync_subsurface` clears the subsurface when `enabled == DISABLED` (:184-186).
|
|
74
|
+
const { el, host } = mount();
|
|
75
|
+
expect(el.style.willChange).toBe('transform');
|
|
76
|
+
el.enabled = 'disabled';
|
|
77
|
+
expect(el.style.willChange).toBe('');
|
|
78
|
+
el.enabled = 'enabled';
|
|
79
|
+
expect(el.style.willChange).toBe('transform');
|
|
80
|
+
host.remove();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await describe('<gtk-graphics-offload> the child', async () => {
|
|
85
|
+
await it('is the one slotted child, in the bin box', () => {
|
|
86
|
+
// `GTK_TYPE_BIN_LAYOUT` (gtkgraphicsoffload.c:290) and the one `child` slot.
|
|
87
|
+
const { el, host } = mount({}, '<gtk-label label="Offloaded"></gtk-label>');
|
|
88
|
+
const label = el.child;
|
|
89
|
+
expect(label?.tagName.toLowerCase()).toBe('gtk-label');
|
|
90
|
+
expect(label?.parentElement?.className).toBe('adw-graphics-offload-child');
|
|
91
|
+
host.remove();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
await it('is still the child when it is appended after connect', async () => {
|
|
95
|
+
// The slot binding is live (src/slotted-children.ts), so a renderer that mounts
|
|
96
|
+
// after the element is connected lands in the same place a parse-time child
|
|
97
|
+
// does — on the microtask where the MutationObserver callback runs.
|
|
98
|
+
const { el, host } = mount();
|
|
99
|
+
const label = document.createElement('gtk-label');
|
|
100
|
+
host.appendChild(label);
|
|
101
|
+
label.remove();
|
|
102
|
+
el.appendChild(label);
|
|
103
|
+
await Promise.resolve();
|
|
104
|
+
expect(el.child).toBe(label);
|
|
105
|
+
host.remove();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
await it('fills the wrapper, whatever the child asks for', () => {
|
|
109
|
+
const { el, host } = mount({}, '<gtk-label label="Offloaded"></gtk-label>');
|
|
110
|
+
// The child box is the bin layout's own node, and the partial is what gives it
|
|
111
|
+
// the whole allocation: `display: block` with `width`/`height` 100% is the CSS
|
|
112
|
+
// spelling of "the child is allocated the widget".
|
|
113
|
+
const box = el.querySelector('.adw-graphics-offload-child') as HTMLElement;
|
|
114
|
+
expect(box).not.toBe(null);
|
|
115
|
+
expect(getComputedStyle(box).display).toBe('block');
|
|
116
|
+
host.remove();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-grid-view>: it is a <gtk-list-view> with a column count, so
|
|
2
|
+
// what is asserted here is the half that differs — the measured track count and the two
|
|
3
|
+
// bounds — plus the proof that the inherited model/selection machinery still reaches it.
|
|
4
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
5
|
+
|
|
6
|
+
import { GRID_VIEW_COLUMN_VECTORS } from '@gjsify/adwaita-core/conformance';
|
|
7
|
+
|
|
8
|
+
import type { GtkGridView } from './elements/gtk-grid-view.js';
|
|
9
|
+
|
|
10
|
+
function mount(attrs: Record<string, string> = {}, width = '640px'): { el: GtkGridView; host: HTMLElement } {
|
|
11
|
+
const host = document.createElement('div');
|
|
12
|
+
host.style.width = width;
|
|
13
|
+
document.body.appendChild(host);
|
|
14
|
+
const el = document.createElement('gtk-grid-view') as GtkGridView;
|
|
15
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
16
|
+
host.appendChild(el);
|
|
17
|
+
return { el, host };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const cells = (el: GtkGridView): HTMLElement[] => [...el.querySelectorAll<HTMLElement>('.adw-grid-view-child')];
|
|
21
|
+
|
|
22
|
+
/** The track COUNT the element wrote, read back off `repeat(<n>, 1fr)`. */
|
|
23
|
+
const tracks = (el: GtkGridView): number => {
|
|
24
|
+
const template = el.querySelector<HTMLElement>('.adw-list-view-rows')?.style.gridTemplateColumns ?? '';
|
|
25
|
+
return Number.parseInt(/repeat\((\d+)/.exec(template)?.[1] ?? '', 10);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const GtkGridViewTest = async () => {
|
|
29
|
+
await describe('<gtk-grid-view> items', async () => {
|
|
30
|
+
await it('draws one child per item, with the grid node name GTK gives them', () => {
|
|
31
|
+
const { el, host } = mount({ model: '["A","B","C"]' });
|
|
32
|
+
expect(cells(el).length).toBe(3);
|
|
33
|
+
expect(cells(el)[0]!.textContent).toBe('A');
|
|
34
|
+
host.remove();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
await it('still selects and splices, because both belong to the list view', () => {
|
|
38
|
+
const { el, host } = mount({ model: '["A","B"]' });
|
|
39
|
+
const before = cells(el);
|
|
40
|
+
cells(el)[1]!.dispatchEvent(new MouseEvent('click', { bubbles: true }));
|
|
41
|
+
expect(el.selected).toStrictEqual([1]);
|
|
42
|
+
el.model = ['A', 'B', 'C'];
|
|
43
|
+
expect(cells(el)[0]).toBe(before[0]);
|
|
44
|
+
expect(cells(el).length).toBe(3);
|
|
45
|
+
host.remove();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
await describe('<gtk-grid-view> drives the column vectors against real boxes', async () => {
|
|
50
|
+
// The two numbers the arithmetic takes are the stylesheet's — a cell's `min-width`
|
|
51
|
+
// and the container's `column-gap` — so a vector is driven by declaring them and
|
|
52
|
+
// reading back the tracks the element wrote.
|
|
53
|
+
for (const vector of GRID_VIEW_COLUMN_VECTORS) {
|
|
54
|
+
await it(vector.rule, () => {
|
|
55
|
+
const { el, host } = mount({ model: '["A","B","C","D","E","F","G","H"]' }, `${vector.forSize}px`);
|
|
56
|
+
const container = el.querySelector<HTMLElement>('.adw-list-view-rows')!;
|
|
57
|
+
container.style.columnGap = `${vector.spacing}px`;
|
|
58
|
+
for (const cell of cells(el)) cell.style.minWidth = `${vector.itemSize}px`;
|
|
59
|
+
// Writing the bounds is also what re-measures: the ResizeObserver fires on
|
|
60
|
+
// a real layout change, and the style writes above are not one.
|
|
61
|
+
el.setAttribute('min-columns', String(vector.minColumns));
|
|
62
|
+
el.setAttribute('max-columns', String(vector.maxColumns));
|
|
63
|
+
expect(tracks(el)).toBe(vector.columns);
|
|
64
|
+
host.remove();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await describe('<gtk-grid-view> columns', async () => {
|
|
70
|
+
await it('defaults to the two bounds GtkGridView declares', () => {
|
|
71
|
+
const { el, host } = mount();
|
|
72
|
+
expect(el.minColumns).toBe(1);
|
|
73
|
+
expect(el.maxColumns).toBe(7);
|
|
74
|
+
host.remove();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await it('reads an attribute that is a positive integer, and ignores anything else', () => {
|
|
78
|
+
const { el, host } = mount({ 'max-columns': '3' });
|
|
79
|
+
expect(el.maxColumns).toBe(3);
|
|
80
|
+
el.setAttribute('max-columns', 'many');
|
|
81
|
+
expect(el.maxColumns).toBe(7);
|
|
82
|
+
el.setAttribute('min-columns', '0');
|
|
83
|
+
expect(el.minColumns).toBe(1);
|
|
84
|
+
host.remove();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
await it('writes as many equal tracks as the width fits', () => {
|
|
88
|
+
// 640px of host, cells floored at 120px with a 6px gap: (640 + 6) / 126 = 5.
|
|
89
|
+
const { el, host } = mount({ model: '["A","B","C","D","E","F"]' });
|
|
90
|
+
expect(tracks(el)).toBe(5);
|
|
91
|
+
host.remove();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
await it('clamps the measured count to max-columns', () => {
|
|
95
|
+
const { el, host } = mount({ model: '["A","B","C","D","E","F"]', 'max-columns': '2' });
|
|
96
|
+
expect(tracks(el)).toBe(2);
|
|
97
|
+
host.remove();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
await it('clamps it up to min-columns in a view too narrow for them', () => {
|
|
101
|
+
const { el, host } = mount({ model: '["A","B","C"]', 'min-columns': '3' }, '140px');
|
|
102
|
+
expect(tracks(el)).toBe(3);
|
|
103
|
+
host.remove();
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-grid>: the four numbers reach CSS Grid as the two spacings and
|
|
2
|
+
// the two `1fr` track sizes, and placement is source order, which is what GtkBuilder does.
|
|
3
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
4
|
+
|
|
5
|
+
import type { GtkGrid } from './elements/gtk-grid.js';
|
|
6
|
+
|
|
7
|
+
function mount(attrs: Record<string, string> = {}, cells = 4): { el: GtkGrid; host: HTMLElement } {
|
|
8
|
+
const host = document.createElement('div');
|
|
9
|
+
document.body.appendChild(host);
|
|
10
|
+
const el = document.createElement('gtk-grid') as GtkGrid;
|
|
11
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
12
|
+
for (let index = 0; index < cells; index += 1) {
|
|
13
|
+
const cell = document.createElement('gtk-label');
|
|
14
|
+
cell.setAttribute('label', `cell ${index}`);
|
|
15
|
+
el.append(cell);
|
|
16
|
+
}
|
|
17
|
+
host.appendChild(el);
|
|
18
|
+
return { el, host };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const GtkGridTest = async () => {
|
|
22
|
+
await describe('<gtk-grid> properties', async () => {
|
|
23
|
+
await it('holds the pspec defaults: no spacing, nothing homogeneous, horizontal', () => {
|
|
24
|
+
const { el, host } = mount();
|
|
25
|
+
expect(el.rowSpacing).toBe(0);
|
|
26
|
+
expect(el.columnSpacing).toBe(0);
|
|
27
|
+
expect(el.rowHomogeneous).toBe(false);
|
|
28
|
+
expect(el.columnHomogeneous).toBe(false);
|
|
29
|
+
expect(el.orientation).toBe('horizontal');
|
|
30
|
+
host.remove();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
await it('a negative spacing is the pspec minimum, and an unparseable one the default', () => {
|
|
34
|
+
const { el, host } = mount({ 'row-spacing': '-4' });
|
|
35
|
+
expect(el.rowSpacing).toBe(0);
|
|
36
|
+
el.setAttribute('column-spacing', 'lots');
|
|
37
|
+
expect(el.columnSpacing).toBe(0);
|
|
38
|
+
el.rowSpacing = 12;
|
|
39
|
+
expect(el.rowSpacing).toBe(12);
|
|
40
|
+
host.remove();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await it('writes the two spacings onto the two gap longhands', () => {
|
|
44
|
+
const { el, host } = mount({ 'row-spacing': '6', 'column-spacing': '18' });
|
|
45
|
+
expect(el.style.rowGap).toBe('6px');
|
|
46
|
+
expect(el.style.columnGap).toBe('18px');
|
|
47
|
+
host.remove();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await it('a homogeneous axis is one equal share of the space the grid is given', () => {
|
|
51
|
+
const { el, host } = mount({ 'column-homogeneous': '', 'row-homogeneous': '' });
|
|
52
|
+
expect(el.style.gridAutoColumns).toBe('1fr');
|
|
53
|
+
expect(el.style.gridAutoRows).toBe('1fr');
|
|
54
|
+
el.columnHomogeneous = false;
|
|
55
|
+
expect(el.style.gridAutoColumns).toBe('');
|
|
56
|
+
host.remove();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await it('a vertical grid attaches down the rows instead of across the columns', () => {
|
|
60
|
+
const { el, host } = mount();
|
|
61
|
+
// `column` first: the default orientation is HORIZONTAL, so an unpositioned
|
|
62
|
+
// child opens a new column rather than a new row (see the element's own note
|
|
63
|
+
// on `find_attach_position`), and `vertical` is the mirror.
|
|
64
|
+
expect(el.style.gridAutoFlow).toBe('column');
|
|
65
|
+
el.orientation = 'vertical';
|
|
66
|
+
expect(el.style.gridAutoFlow).toBe('row');
|
|
67
|
+
el.setAttribute('orientation', 'sideways');
|
|
68
|
+
expect(el.orientation).toBe('horizontal');
|
|
69
|
+
host.remove();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await describe('<gtk-grid> look', async () => {
|
|
74
|
+
await it('is a CSS grid, and a generic one', () => {
|
|
75
|
+
const { el, host } = mount();
|
|
76
|
+
expect(getComputedStyle(el).display).toBe('grid');
|
|
77
|
+
expect(el.getAttribute('role')).toBe('generic');
|
|
78
|
+
host.remove();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
await it('appends every unpositioned child to row 0, at the next free column', () => {
|
|
82
|
+
const { el, host } = mount({}, 3);
|
|
83
|
+
const [first, second, third] = Array.from(el.children) as HTMLElement[];
|
|
84
|
+
const a = first.getBoundingClientRect();
|
|
85
|
+
const b = second.getBoundingClientRect();
|
|
86
|
+
const c = third.getBoundingClientRect();
|
|
87
|
+
// `find_attach_position` searches the cross range that starts at 0 and returns
|
|
88
|
+
// the MAXIMUM position along the orientation (gtkgrid.c:293-342), so the row
|
|
89
|
+
// stays 0 and only the column grows: all three share one row, left to right.
|
|
90
|
+
// They do NOT wrap into a second row — that would need an explicit track count.
|
|
91
|
+
expect(Math.round(a.top)).toBe(Math.round(b.top));
|
|
92
|
+
expect(Math.round(b.top)).toBe(Math.round(c.top));
|
|
93
|
+
expect(Math.round(a.left)).toBeLessThan(Math.round(b.left));
|
|
94
|
+
expect(Math.round(b.left)).toBeLessThan(Math.round(c.left));
|
|
95
|
+
host.remove();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
await it('fills column 0 downward when the orientation is vertical', () => {
|
|
99
|
+
const { el, host } = mount({ orientation: 'vertical' }, 3);
|
|
100
|
+
const [first, second, third] = Array.from(el.children) as HTMLElement[];
|
|
101
|
+
const a = first.getBoundingClientRect();
|
|
102
|
+
const b = second.getBoundingClientRect();
|
|
103
|
+
const c = third.getBoundingClientRect();
|
|
104
|
+
// The mirror of the horizontal case: the column stays 0, the row grows.
|
|
105
|
+
expect(Math.round(a.left)).toBe(Math.round(b.left));
|
|
106
|
+
expect(Math.round(b.left)).toBe(Math.round(c.left));
|
|
107
|
+
expect(Math.round(a.top)).toBeLessThan(Math.round(b.top));
|
|
108
|
+
expect(Math.round(b.top)).toBeLessThan(Math.round(c.top));
|
|
109
|
+
host.remove();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
await it('notifies on a real change and on none that did not happen', () => {
|
|
113
|
+
const { el, host } = mount();
|
|
114
|
+
const notified: unknown[] = [];
|
|
115
|
+
el.addEventListener('notify::row-spacing', (e) => notified.push((e as CustomEvent).detail));
|
|
116
|
+
el.rowSpacing = 8;
|
|
117
|
+
el.rowSpacing = 8;
|
|
118
|
+
expect(notified).toStrictEqual([{ 'row-spacing': 8 }]);
|
|
119
|
+
host.remove();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
};
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-header-bar>. The bar is three separable things: WHERE a child
|
|
2
|
+
// lands (`start` appends, `end` prepends, an untyped child packs from the start —
|
|
3
|
+
// gtkheaderbar.c:843-861), the two window controls `show-title-buttons` creates and destroys
|
|
4
|
+
// (:198-249, :798-826), and the centre either/or between a `title-widget` and the derived
|
|
5
|
+
// `GtkLabel` (:274-290, :313-341).
|
|
6
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
7
|
+
|
|
8
|
+
import type { GtkHeaderBar } from './elements/gtk-header-bar.js';
|
|
9
|
+
import type { GtkWindow } from './elements/gtk-window.js';
|
|
10
|
+
|
|
11
|
+
function bar(attrs: Record<string, string> = {}): { el: GtkHeaderBar; host: HTMLElement } {
|
|
12
|
+
const host = document.createElement('div');
|
|
13
|
+
document.body.appendChild(host);
|
|
14
|
+
const el = document.createElement('gtk-header-bar') as GtkHeaderBar;
|
|
15
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
16
|
+
host.appendChild(el);
|
|
17
|
+
return { el, host };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function child(slot: string | undefined, text: string): HTMLElement {
|
|
21
|
+
const el = document.createElement('span');
|
|
22
|
+
if (slot !== undefined) el.setAttribute('slot', slot);
|
|
23
|
+
el.textContent = text;
|
|
24
|
+
return el;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function classesIn(box: HTMLElement | null): string[] {
|
|
28
|
+
return [...(box?.children ?? [])].map((node) => [...node.classList].sort().join('.'));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const GtkHeaderBarTest = async () => {
|
|
32
|
+
await describe('<gtk-header-bar> structure', async () => {
|
|
33
|
+
await it('is the CSS tree of gtkheaderbar.c:99-116', () => {
|
|
34
|
+
const { el, host } = bar();
|
|
35
|
+
const handle = el.firstElementChild;
|
|
36
|
+
expect(handle?.className).toBe('adw-gtk-header-bar-handle');
|
|
37
|
+
const box = handle?.firstElementChild;
|
|
38
|
+
expect(box?.className).toBe('adw-gtk-header-bar-box');
|
|
39
|
+
expect(classesIn(box as HTMLElement)).toStrictEqual([
|
|
40
|
+
'adw-gtk-header-bar-start',
|
|
41
|
+
'adw-gtk-header-bar-end',
|
|
42
|
+
'adw-gtk-header-bar-title.title',
|
|
43
|
+
]);
|
|
44
|
+
expect(el.getAttribute('role')).toBe('group');
|
|
45
|
+
host.remove();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await it('appends a `start` child and PREPENDS an `end` one', async () => {
|
|
49
|
+
// gtk_header_bar_pack (:843-861): gtk_box_append / gtk_box_prepend.
|
|
50
|
+
const { el, host } = bar();
|
|
51
|
+
const box = el.querySelector('.adw-gtk-header-bar-box') as HTMLElement;
|
|
52
|
+
const start = child('start', 'a');
|
|
53
|
+
const end = child('end', 'z');
|
|
54
|
+
el.append(start, end);
|
|
55
|
+
// Adoption is the MutationObserver's, so it lands on the next microtask
|
|
56
|
+
// (`src/slotted-children.ts`).
|
|
57
|
+
await Promise.resolve();
|
|
58
|
+
expect(start.parentElement?.className).toBe('adw-gtk-header-bar-start');
|
|
59
|
+
expect(end.parentElement?.className).toBe('adw-gtk-header-bar-end');
|
|
60
|
+
// The start box opens with the PREPENDED window controls (:243), which carry no
|
|
61
|
+
// text of their own — hence the leading ''.
|
|
62
|
+
el.append(child('start', 'b'));
|
|
63
|
+
await Promise.resolve();
|
|
64
|
+
expect(
|
|
65
|
+
[...box.querySelector('.adw-gtk-header-bar-start')!.children].map((n) => n.textContent),
|
|
66
|
+
).toStrictEqual(['', 'a', 'b']);
|
|
67
|
+
el.append(child('end', 'y'));
|
|
68
|
+
await Promise.resolve();
|
|
69
|
+
// The end box closes with the APPENDED window controls (:245), and `y` PREPENDED
|
|
70
|
+
// in front of `z` — the order the two halves are packed by.
|
|
71
|
+
expect([...box.querySelector('.adw-gtk-header-bar-end')!.children].map((n) => n.textContent)).toStrictEqual(
|
|
72
|
+
['y', 'z', ''],
|
|
73
|
+
);
|
|
74
|
+
host.remove();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await it('packs an untyped child from the start', async () => {
|
|
78
|
+
// gtkheaderbar.c:698 — `type == NULL` is pack_start.
|
|
79
|
+
const { el, host } = bar();
|
|
80
|
+
const loose = child(undefined, 'loose');
|
|
81
|
+
el.appendChild(loose);
|
|
82
|
+
await Promise.resolve();
|
|
83
|
+
expect(loose.parentElement?.className).toBe('adw-gtk-header-bar-start');
|
|
84
|
+
host.remove();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
await describe('<gtk-header-bar> the title', async () => {
|
|
89
|
+
await it('derives it from the root window, and re-derives on notify::title', async () => {
|
|
90
|
+
// gtk_header_bar_root (gtkheaderbar.c:362-376) connects notify::title on the root.
|
|
91
|
+
const host = document.createElement('div');
|
|
92
|
+
document.body.appendChild(host);
|
|
93
|
+
const win = document.createElement('gtk-window') as GtkWindow;
|
|
94
|
+
win.setAttribute('title', 'Documents');
|
|
95
|
+
const el = document.createElement('gtk-header-bar') as GtkHeaderBar;
|
|
96
|
+
win.appendChild(el);
|
|
97
|
+
host.appendChild(win);
|
|
98
|
+
const label = () => el.querySelector('.adw-gtk-header-bar-title');
|
|
99
|
+
expect(label()?.getAttribute('label')).toBe('Documents');
|
|
100
|
+
win.setAttribute('title', 'Documents — 12');
|
|
101
|
+
await Promise.resolve();
|
|
102
|
+
await Promise.resolve();
|
|
103
|
+
expect(label()?.getAttribute('label')).toBe('Documents — 12');
|
|
104
|
+
host.remove();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
await it('falls back to the page title, which is the process name here', async () => {
|
|
108
|
+
// update_title (gtkheaderbar.c:250-271) ends at g_get_application_name(), which is
|
|
109
|
+
// the application's name — and a page's own <title> is that, one level up.
|
|
110
|
+
const { el, host } = bar();
|
|
111
|
+
expect(el.querySelector('.adw-gtk-header-bar-title')?.getAttribute('label')).toBe(document.title);
|
|
112
|
+
host.remove();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
await it('a title-widget takes the centre and the derived label goes', async () => {
|
|
116
|
+
// gtk_header_bar_set_title_widget (:319-336): the bin is emptied first.
|
|
117
|
+
const { el, host } = bar();
|
|
118
|
+
const widget = child('title', 'My App');
|
|
119
|
+
el.appendChild(widget);
|
|
120
|
+
await Promise.resolve();
|
|
121
|
+
expect(el.querySelector('.adw-gtk-header-bar-title')).toBe(null);
|
|
122
|
+
expect(widget.parentElement?.className).toBe('adw-gtk-header-bar-box');
|
|
123
|
+
expect(el.titleWidget).toBe(widget);
|
|
124
|
+
host.remove();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
await it('taking the widget away REBUILDS the derived label', async () => {
|
|
128
|
+
// :332-336 — the NULL branch constructs it again. `<adw-header-bar>` cannot do
|
|
129
|
+
// this; the asymmetry is what its own header records.
|
|
130
|
+
const { el, host } = bar();
|
|
131
|
+
const widget = child('title', 'My App');
|
|
132
|
+
el.appendChild(widget);
|
|
133
|
+
await Promise.resolve();
|
|
134
|
+
widget.remove();
|
|
135
|
+
await Promise.resolve();
|
|
136
|
+
await Promise.resolve();
|
|
137
|
+
expect(el.querySelector('.adw-gtk-header-bar-title')).not.toBe(null);
|
|
138
|
+
expect(el.titleWidget).toBe(null);
|
|
139
|
+
host.remove();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
await it('accepts the deprecated `title-widget` spelling of the same slot', async () => {
|
|
143
|
+
// gtkheaderbar.c:683-686 — `gtk_buildable_child_deprecation_warning` on `"title"`,
|
|
144
|
+
// which the property-position spelling in a `.blp` is the replacement for.
|
|
145
|
+
const { el, host } = bar();
|
|
146
|
+
const widget = child('title-widget', 'My App');
|
|
147
|
+
el.appendChild(widget);
|
|
148
|
+
await Promise.resolve();
|
|
149
|
+
expect(el.querySelector('.adw-gtk-header-bar-title')).toBe(null);
|
|
150
|
+
host.remove();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
await describe('<gtk-header-bar> show-title-buttons', async () => {
|
|
155
|
+
await it('creates one controls at each end, prepended and appended', async () => {
|
|
156
|
+
// create_window_controls (gtkheaderbar.c:198-249).
|
|
157
|
+
const { el, host } = bar();
|
|
158
|
+
const start = el.querySelector('.adw-gtk-header-bar-start') as HTMLElement;
|
|
159
|
+
const end = el.querySelector('.adw-gtk-header-bar-end') as HTMLElement;
|
|
160
|
+
expect(start.firstElementChild?.localName).toBe('gtk-window-controls');
|
|
161
|
+
expect(start.firstElementChild?.getAttribute('side')).toBe('start');
|
|
162
|
+
expect(end.lastElementChild?.localName).toBe('gtk-window-controls');
|
|
163
|
+
expect(end.lastElementChild?.getAttribute('side')).toBe('end');
|
|
164
|
+
host.remove();
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
await it('`show-title-buttons="false"` REMOVES them rather than hiding them', async () => {
|
|
168
|
+
// gtk_header_bar_set_show_title_buttons (:806-824) unparents both.
|
|
169
|
+
const { el, host } = bar();
|
|
170
|
+
el.showTitleButtons = false;
|
|
171
|
+
expect(el.querySelector('gtk-window-controls')).toBe(null);
|
|
172
|
+
el.showTitleButtons = true;
|
|
173
|
+
expect(el.querySelectorAll('gtk-window-controls').length).toBe(2);
|
|
174
|
+
host.remove();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
await it('binds `decoration-layout` onto both controls', async () => {
|
|
178
|
+
// The two G_BINDING_SYNC_CREATE bindings of :229-247.
|
|
179
|
+
const { el, host } = bar();
|
|
180
|
+
el.decorationLayout = 'menu:close';
|
|
181
|
+
for (const controls of Array.from(el.querySelectorAll('gtk-window-controls'))) {
|
|
182
|
+
expect(controls.getAttribute('decoration-layout')).toBe('menu:close');
|
|
183
|
+
}
|
|
184
|
+
el.decorationLayout = null;
|
|
185
|
+
expect(el.querySelector('gtk-window-controls')?.hasAttribute('decoration-layout')).toBe(false);
|
|
186
|
+
host.remove();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
await it('notifies only on a real change', async () => {
|
|
190
|
+
// From the GIR default (TRUE, :657) written out, so the first write below changes
|
|
191
|
+
// nothing — `gtk_header_bar_set_show_title_buttons` returns early (:802-803).
|
|
192
|
+
const { el, host } = bar({ 'show-title-buttons': 'true' });
|
|
193
|
+
const events: unknown[] = [];
|
|
194
|
+
el.addEventListener('notify::show-title-buttons', (e) => events.push((e as CustomEvent).detail));
|
|
195
|
+
el.showTitleButtons = true;
|
|
196
|
+
el.showTitleButtons = false;
|
|
197
|
+
el.showTitleButtons = false;
|
|
198
|
+
expect(events).toStrictEqual([{ 'show-title-buttons': false }]);
|
|
199
|
+
host.remove();
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
};
|