@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,244 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-scrollbar>: the two properties it has (an adjustment and an
|
|
2
|
+
// orientation), `GtkRange`'s slider geometry in the two fractions upstream computes, and the
|
|
3
|
+
// keys `GtkScrollbar`'s own documentation names.
|
|
4
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
5
|
+
|
|
6
|
+
import type { GtkScrollbar } from './elements/gtk-scrollbar.js';
|
|
7
|
+
|
|
8
|
+
/** A scrollbar of a known size, so the trough's own length — the fraction's denominator — is exact. */
|
|
9
|
+
function mount(vertical = false): { el: GtkScrollbar; host: HTMLElement } {
|
|
10
|
+
const host = document.createElement('div');
|
|
11
|
+
host.style.width = '300px';
|
|
12
|
+
host.style.height = '300px';
|
|
13
|
+
document.body.appendChild(host);
|
|
14
|
+
const el = document.createElement('gtk-scrollbar') as GtkScrollbar;
|
|
15
|
+
if (vertical) el.setAttribute('orientation', 'vertical');
|
|
16
|
+
el.style.height = vertical ? '200px' : '24px';
|
|
17
|
+
el.style.width = vertical ? '24px' : '200px';
|
|
18
|
+
host.appendChild(el);
|
|
19
|
+
return { el, host };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const parts = (bar: GtkScrollbar): { trough: HTMLElement; slider: HTMLElement } => ({
|
|
23
|
+
trough: bar.querySelector('.adw-scrollbar-trough') as HTMLElement,
|
|
24
|
+
slider: bar.querySelector('.adw-scrollbar-slider') as HTMLElement,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/** `--adw-scrollbar-size` / `--adw-scrollbar-position`, which is what `_render` computed. */
|
|
28
|
+
const geometry = (slider: HTMLElement): { size: number; position: number } => ({
|
|
29
|
+
size: Number.parseFloat(slider.style.getPropertyValue('--adw-scrollbar-size')),
|
|
30
|
+
position: Number.parseFloat(slider.style.getPropertyValue('--adw-scrollbar-position')),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const press = (el: HTMLElement, key: string): void => {
|
|
34
|
+
el.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true }));
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const GtkScrollbarTest = async () => {
|
|
38
|
+
await describe('<gtk-scrollbar> its two properties', async () => {
|
|
39
|
+
await it('is a horizontal scrollbar with NO adjustment, which is the pspec default', async () => {
|
|
40
|
+
const { el, host } = mount();
|
|
41
|
+
expect(el.orientation).toBe('horizontal');
|
|
42
|
+
expect(el.classList.contains('horizontal')).toBe(true);
|
|
43
|
+
expect(el.getAttribute('role')).toBe('scrollbar');
|
|
44
|
+
expect(el.getAttribute('aria-orientation')).toBe('horizontal');
|
|
45
|
+
// A NULL adjustment is not a null range: `gtk_range_set_adjustment` answers one
|
|
46
|
+
// with `gtk_adjustment_new (0, 0, 0, 0, 0, 0)` (gtkrange.c:687-688), so the
|
|
47
|
+
// property reads back a real adjustment whose `upper` is 0.
|
|
48
|
+
expect(el.adjustment.upper).toBe(0);
|
|
49
|
+
expect(el.adjustment.lower).toBe(0);
|
|
50
|
+
// `upper - lower == 0` puts the thumb at 0, and the accessible range is all zeros
|
|
51
|
+
// too — which is `upper - page_size`, `lower` and `value` (gtkscrollbar.c:309-313).
|
|
52
|
+
expect(el.getAttribute('aria-valuemin')).toBe('0');
|
|
53
|
+
expect(el.getAttribute('aria-valuemax')).toBe('0');
|
|
54
|
+
expect(el.getAttribute('aria-valuenow')).toBe('0');
|
|
55
|
+
// And NO insensitivity: nothing in gtkscrollbar.c, gtkrange.c or
|
|
56
|
+
// gtkscrolledwindow.c ever calls `gtk_widget_set_sensitive` on a bar.
|
|
57
|
+
expect(el.getAttribute('aria-disabled')).toBe(null);
|
|
58
|
+
expect(el.hasAttribute('disabled')).toBe(false);
|
|
59
|
+
host.remove();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
await it('leaves the thumb at its own size when there is no range to scroll', async () => {
|
|
63
|
+
const { el, host } = mount(true);
|
|
64
|
+
const { trough, slider } = parts(el);
|
|
65
|
+
// `upper - lower != 0` is the condition the C guards its fraction with
|
|
66
|
+
// (gtkrange.c:2779-2782); without it the slider takes its OWN measured size,
|
|
67
|
+
// which is why no length is written and the stylesheet's `$_slider_min_length`
|
|
68
|
+
// floor stands in for what GTK measured.
|
|
69
|
+
expect(trough.clientHeight > 0).toBe(true);
|
|
70
|
+
expect(slider.style.getPropertyValue('--adw-scrollbar-size')).toBe('');
|
|
71
|
+
// The POSITION is 0 either way — `upper - lower - page_size != 0` is the C's
|
|
72
|
+
// own guard for it (gtkrange.c:2790-2793) — but it is always written.
|
|
73
|
+
expect(slider.style.getPropertyValue('--adw-scrollbar-position')).toBe('0px');
|
|
74
|
+
host.remove();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await it('reads the adjustment from its JSON attribute and announces the range', async () => {
|
|
78
|
+
const { el, host } = mount(true);
|
|
79
|
+
el.setAttribute('adjustment', '{"upper":200,"pageSize":50,"stepIncrement":10,"pageIncrement":40}');
|
|
80
|
+
expect(el.adjustment.upper).toBe(200);
|
|
81
|
+
expect(el.getAttribute('aria-valuemin')).toBe('0');
|
|
82
|
+
// `aria-valuemax` is `upper - page_size`, the position the bar can reach.
|
|
83
|
+
expect(el.getAttribute('aria-valuemax')).toBe('150');
|
|
84
|
+
expect(el.getAttribute('aria-valuenow')).toBe('0');
|
|
85
|
+
expect(el.classList.contains('vertical')).toBe(true);
|
|
86
|
+
host.remove();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
await it('notifies the property when the adjustment is replaced', async () => {
|
|
90
|
+
const { el, host } = mount();
|
|
91
|
+
const seen: unknown[] = [];
|
|
92
|
+
el.addEventListener('notify::adjustment', (e) => seen.push((e as CustomEvent).detail));
|
|
93
|
+
el.adjustment = { lower: 0, upper: 10, stepIncrement: 1, pageIncrement: 1, pageSize: 0, value: 0 };
|
|
94
|
+
expect(seen.length).toBe(1);
|
|
95
|
+
el.setAttribute('adjustment', '{"upper":20}');
|
|
96
|
+
// A partial write MERGES, which is `gtk_adjustment_configure`'s contract.
|
|
97
|
+
expect(el.adjustment.upper).toBe(20);
|
|
98
|
+
expect(el.adjustment.stepIncrement).toBe(1);
|
|
99
|
+
host.remove();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
await it('clamps the value it is given, which is what the setter promises', async () => {
|
|
103
|
+
const { el, host } = mount();
|
|
104
|
+
el.adjustment = { lower: 0, upper: 100, stepIncrement: 1, pageIncrement: 10, pageSize: 0, value: 0 };
|
|
105
|
+
el.value = 500;
|
|
106
|
+
expect(el.value).toBe(100);
|
|
107
|
+
el.value = -20;
|
|
108
|
+
expect(el.value).toBe(0);
|
|
109
|
+
host.remove();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
await describe('<gtk-scrollbar> the trough pointer rules', async () => {
|
|
114
|
+
await it('warps on a primary click outside the slider, wherever in the bar it lands', async () => {
|
|
115
|
+
const { el, host } = mount();
|
|
116
|
+
el.adjustment = { lower: 0, upper: 200, stepIncrement: 10, pageIncrement: 40, pageSize: 50, value: 0 };
|
|
117
|
+
const { trough, slider } = parts(el);
|
|
118
|
+
const box = trough.getBoundingClientRect();
|
|
119
|
+
// The BAR, not the trough: `gtk_range_click_gesture_pressed` folds everything
|
|
120
|
+
// that is not the slider into the trough (gtkrange.c:2052-2058), and libadwaita
|
|
121
|
+
// gives the trough its own `margin: 9px` (`_scrolling.scss:7`), so the margin
|
|
122
|
+
// between the bar's edge and the trough's is trough to GTK.
|
|
123
|
+
expect(box.left - el.getBoundingClientRect().left).toBeGreaterThan(0);
|
|
124
|
+
el.dispatchEvent(
|
|
125
|
+
new PointerEvent('pointerdown', {
|
|
126
|
+
button: 0,
|
|
127
|
+
bubbles: true,
|
|
128
|
+
cancelable: true,
|
|
129
|
+
clientX: box.left + box.width * 0.75,
|
|
130
|
+
clientY: box.top + box.height / 2,
|
|
131
|
+
}),
|
|
132
|
+
);
|
|
133
|
+
// `gtk-primary-button-warps-slider` defaults TRUE (gtksettings.c:734-736), so the
|
|
134
|
+
// slider jumps to three quarters of the trough.
|
|
135
|
+
expect(el.value > 100).toBe(true);
|
|
136
|
+
expect(slider.classList.contains('fine-tune')).toBe(false);
|
|
137
|
+
host.remove();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
await it('pages on a middle click instead, and Shift is the fine adjustment', async () => {
|
|
141
|
+
const { el, host } = mount();
|
|
142
|
+
el.adjustment = { lower: 0, upper: 400, stepIncrement: 10, pageIncrement: 40, pageSize: 0, value: 0 };
|
|
143
|
+
const { trough, slider } = parts(el);
|
|
144
|
+
const box = trough.getBoundingClientRect();
|
|
145
|
+
const at = (button: number, shiftKey: boolean, fraction: number): void => {
|
|
146
|
+
el.dispatchEvent(
|
|
147
|
+
new PointerEvent('pointerdown', {
|
|
148
|
+
button,
|
|
149
|
+
shiftKey,
|
|
150
|
+
bubbles: true,
|
|
151
|
+
cancelable: true,
|
|
152
|
+
clientX: box.left + box.width * fraction,
|
|
153
|
+
clientY: box.top + box.height / 2,
|
|
154
|
+
}),
|
|
155
|
+
);
|
|
156
|
+
};
|
|
157
|
+
at(1, false, 0.9);
|
|
158
|
+
// A middle button PAGES toward the click (gtkrange.c:2097-2115), so a whole
|
|
159
|
+
// page increment rather than the click's own position.
|
|
160
|
+
expect(el.value).toBe(40);
|
|
161
|
+
// The direction is `click_value > value` — a bisection by click position, so
|
|
162
|
+
// the clicks are taken clearly to either side of where 40 sits (a tenth of the
|
|
163
|
+
// free space) rather than exactly on it, where the comparison is a tie.
|
|
164
|
+
at(0, true, 0.05);
|
|
165
|
+
expect(el.value).toBe(0);
|
|
166
|
+
at(0, true, 0.5);
|
|
167
|
+
expect(el.value).toBe(40);
|
|
168
|
+
// Shift on the SLIDER is the fine adjustment, not a page.
|
|
169
|
+
at(0, true, 0.5);
|
|
170
|
+
expect(slider.classList.contains('fine-tune')).toBe(false);
|
|
171
|
+
host.remove();
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
await describe("<gtk-scrollbar> GtkRange's slider geometry", async () => {
|
|
176
|
+
await it('sizes the slider by page_size over the whole range, and places it by the SCROLLABLE one', async () => {
|
|
177
|
+
const { el, host } = mount(true);
|
|
178
|
+
el.adjustment = { lower: 0, upper: 400, stepIncrement: 10, pageIncrement: 40, pageSize: 100, value: 0 };
|
|
179
|
+
const { trough, slider } = parts(el);
|
|
180
|
+
const length = trough.clientHeight;
|
|
181
|
+
expect(length > 0).toBe(true);
|
|
182
|
+
// Two DIFFERENT denominators: the length is a quarter of the range, the position
|
|
183
|
+
// a fraction of the 300 that is left once the page is out of it.
|
|
184
|
+
expect(geometry(slider).size).toBe(length * 0.25);
|
|
185
|
+
expect(geometry(slider).position).toBe(0);
|
|
186
|
+
el.value = 300;
|
|
187
|
+
expect(geometry(slider).position).toBe(length - length * 0.25);
|
|
188
|
+
host.remove();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
await it('puts the slider at the far end for the last reachable value', async () => {
|
|
192
|
+
const { el, host } = mount();
|
|
193
|
+
el.adjustment = { lower: 0, upper: 200, stepIncrement: 10, pageIncrement: 40, pageSize: 50, value: 150 };
|
|
194
|
+
const { trough, slider } = parts(el);
|
|
195
|
+
const length = trough.clientWidth;
|
|
196
|
+
expect(geometry(slider).position).toBe(length - length * 0.25);
|
|
197
|
+
host.remove();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
await describe('<gtk-scrollbar> the keys its own doc names', async () => {
|
|
202
|
+
await it('steps with the arrows, pages with Page Up/Down and jumps with Home/End', async () => {
|
|
203
|
+
const { el, host } = mount();
|
|
204
|
+
el.adjustment = { lower: 0, upper: 100, stepIncrement: 5, pageIncrement: 25, pageSize: 0, value: 0 };
|
|
205
|
+
el.focus();
|
|
206
|
+
press(el, 'ArrowRight');
|
|
207
|
+
expect(el.value).toBe(5);
|
|
208
|
+
press(el, 'ArrowLeft');
|
|
209
|
+
expect(el.value).toBe(0);
|
|
210
|
+
press(el, 'PageDown');
|
|
211
|
+
expect(el.value).toBe(25);
|
|
212
|
+
press(el, 'Home');
|
|
213
|
+
expect(el.value).toBe(0);
|
|
214
|
+
press(el, 'End');
|
|
215
|
+
expect(el.value).toBe(100);
|
|
216
|
+
host.remove();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
await it('answers only the arrows on its OWN axis', async () => {
|
|
220
|
+
const { el, host } = mount(true);
|
|
221
|
+
el.adjustment = { lower: 0, upper: 100, stepIncrement: 5, pageIncrement: 25, pageSize: 0, value: 0 };
|
|
222
|
+
el.focus();
|
|
223
|
+
// A horizontal bar's keys must not move a vertical one, and the other way round.
|
|
224
|
+
press(el, 'ArrowRight');
|
|
225
|
+
expect(el.value).toBe(0);
|
|
226
|
+
press(el, 'ArrowDown');
|
|
227
|
+
expect(el.value).toBe(5);
|
|
228
|
+
host.remove();
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
await it('clamps every key back to zero without an adjustment', async () => {
|
|
232
|
+
const { el, host } = mount();
|
|
233
|
+
el.focus();
|
|
234
|
+
// Not because the keys are refused — `resolveRangeKey` answers and
|
|
235
|
+
// `scrollBy` runs — but because `set_value` over the zero adjustment clamps to
|
|
236
|
+
// 0 and reports no change, which is the same answer `upper - page_size` gives.
|
|
237
|
+
press(el, 'End');
|
|
238
|
+
expect(el.value).toBe(0);
|
|
239
|
+
press(el, 'ArrowRight');
|
|
240
|
+
expect(el.value).toBe(0);
|
|
241
|
+
host.remove();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-scrolled-window>: the parts are GTK's (a viewport and two
|
|
2
|
+
// scrollbars), the visibility rule is `upper - lower > page_size` and nothing else, and the
|
|
3
|
+
// keys are the ones `gtk_scrolled_window_class_init` installs — Control for the arrows, and
|
|
4
|
+
// Page Up/Down on the vertical axis bare while Ctrl+Page Up/Down is the horizontal one.
|
|
5
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
6
|
+
|
|
7
|
+
import type { GtkScrolledWindow } from './elements/gtk-scrolled-window.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A host of a known size and a window of its own, because GTK gives this widget an
|
|
11
|
+
* ALLOCATION and a browser one has to be given the same: an auto-height scrolled window grows
|
|
12
|
+
* with its content and has nothing to scroll.
|
|
13
|
+
*/
|
|
14
|
+
function mount(width = 200, height = 100): { el: GtkScrolledWindow; host: HTMLElement } {
|
|
15
|
+
const host = document.createElement('div');
|
|
16
|
+
host.style.width = `${width}px`;
|
|
17
|
+
host.style.height = `${height}px`;
|
|
18
|
+
document.body.appendChild(host);
|
|
19
|
+
const el = document.createElement('gtk-scrolled-window') as GtkScrolledWindow;
|
|
20
|
+
el.style.height = `${height}px`;
|
|
21
|
+
host.appendChild(el);
|
|
22
|
+
return { el, host };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* One frame plus a microtask, which is where the slot observer's callback and the viewport's
|
|
27
|
+
* content watcher both land: the observer that adopts a late child is a microtask, and the one
|
|
28
|
+
* that re-measures the content is a `ResizeObserver`, delivered before the next paint.
|
|
29
|
+
*/
|
|
30
|
+
const settle = async (): Promise<void> => {
|
|
31
|
+
await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A column of labels taller than the window, which is what makes a bar appear.
|
|
36
|
+
*
|
|
37
|
+
* Appended AFTER connect on purpose — the binding is live, so a child added later lands where
|
|
38
|
+
* a declared one does, and the tests below are written against that rather than against a
|
|
39
|
+
* parse-time snapshot.
|
|
40
|
+
*/
|
|
41
|
+
async function fill(el: GtkScrolledWindow, rows = 10): Promise<void> {
|
|
42
|
+
for (let i = 0; i < rows; i++) {
|
|
43
|
+
const label = document.createElement('gtk-label');
|
|
44
|
+
label.setAttribute('label', `Row ${i}`);
|
|
45
|
+
// A flex item is blockified, so the height on the label is the box the viewport
|
|
46
|
+
// measures; an inline label would ignore it.
|
|
47
|
+
label.style.height = '40px';
|
|
48
|
+
el.appendChild(label);
|
|
49
|
+
}
|
|
50
|
+
await settle();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const bars = (el: GtkScrolledWindow): { horizontal: HTMLElement; vertical: HTMLElement } => ({
|
|
54
|
+
horizontal: el.hscrollbar() as HTMLElement,
|
|
55
|
+
vertical: el.vscrollbar() as HTMLElement,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
/** The `detail` of every `event` dispatched on (or bubbling to) `el`. */
|
|
59
|
+
function record(el: HTMLElement, event: string): unknown[] {
|
|
60
|
+
const details: unknown[] = [];
|
|
61
|
+
el.addEventListener(event, (e) => details.push((e as CustomEvent).detail));
|
|
62
|
+
return details;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const press = (el: HTMLElement, key: string, init: KeyboardEventInit = {}): void => {
|
|
66
|
+
el.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true, ...init }));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const GtkScrolledWindowTest = async () => {
|
|
70
|
+
await describe('<gtk-scrolled-window> its parts', async () => {
|
|
71
|
+
await it('builds a viewport and two scrollbars, and routes the child into the viewport', async () => {
|
|
72
|
+
const { el, host } = mount();
|
|
73
|
+
await fill(el, 2);
|
|
74
|
+
// GTK wraps a non-scrollable child in a GtkViewport and parents THAT
|
|
75
|
+
// (gtkscrolledwindow.c:785-793), which is what the DOM says here.
|
|
76
|
+
expect(el.viewport.localName).toBe('gtk-viewport');
|
|
77
|
+
expect(el.viewport.childElementCount).toBe(2);
|
|
78
|
+
expect(bars(el).vertical.getAttribute('orientation')).toBe('vertical');
|
|
79
|
+
expect(bars(el).horizontal.getAttribute('orientation')).toBe('horizontal');
|
|
80
|
+
expect(el.getAttribute('role')).toBe('generic');
|
|
81
|
+
host.remove();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await it('keeps a child appended after connect in the viewport', async () => {
|
|
85
|
+
const { el, host } = mount();
|
|
86
|
+
const late = document.createElement('gtk-label');
|
|
87
|
+
el.appendChild(late);
|
|
88
|
+
await settle();
|
|
89
|
+
expect(el.viewport.contains(late)).toBe(true);
|
|
90
|
+
host.remove();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
await describe('<gtk-scrolled-window> the policies', async () => {
|
|
95
|
+
await it('shows an automatic bar only while the content is longer than the window', async () => {
|
|
96
|
+
const { el, host } = mount();
|
|
97
|
+
expect(bars(el).vertical.hidden).toBe(true);
|
|
98
|
+
await fill(el, 10);
|
|
99
|
+
expect(bars(el).vertical.hidden).toBe(false);
|
|
100
|
+
host.remove();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
await it('draws an ALWAYS bar with nothing to scroll, and no NEVER bar ever', async () => {
|
|
104
|
+
const { el, host } = mount();
|
|
105
|
+
el.setAttribute('vscrollbar-policy', 'always');
|
|
106
|
+
expect(bars(el).vertical.hidden).toBe(false);
|
|
107
|
+
el.setAttribute('vscrollbar-policy', 'never');
|
|
108
|
+
expect(bars(el).vertical.hidden).toBe(true);
|
|
109
|
+
await fill(el, 10);
|
|
110
|
+
expect(bars(el).vertical.hidden).toBe(true);
|
|
111
|
+
// An unknown nick is the pspec's `automatic`, not a silent never.
|
|
112
|
+
el.setAttribute('vscrollbar-policy', 'sideways');
|
|
113
|
+
expect(el.vscrollbarPolicy).toBe('automatic');
|
|
114
|
+
expect(bars(el).vertical.hidden).toBe(false);
|
|
115
|
+
host.remove();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
await it('carries the corner and the frame as classes, and the sizes as CSS', async () => {
|
|
119
|
+
const { el, host } = mount();
|
|
120
|
+
expect(el.classList.contains('top-left')).toBe(true);
|
|
121
|
+
el.setAttribute('window-placement', 'bottom-right');
|
|
122
|
+
expect(el.classList.contains('bottom-right')).toBe(true);
|
|
123
|
+
expect(el.classList.contains('top-left')).toBe(false);
|
|
124
|
+
el.setAttribute('has-frame', '');
|
|
125
|
+
expect(el.classList.contains('frame')).toBe(true);
|
|
126
|
+
// -1 is the pspec's default and writes NOTHING, as a size request of no value.
|
|
127
|
+
el.setAttribute('min-content-width', '200');
|
|
128
|
+
el.setAttribute('max-content-height', '300');
|
|
129
|
+
expect(el.style.minWidth).toBe('200px');
|
|
130
|
+
expect(el.style.maxHeight).toBe('300px');
|
|
131
|
+
expect(el.style.minHeight).toBe('');
|
|
132
|
+
expect(el.minContentWidth).toBe(200);
|
|
133
|
+
expect(el.maxContentHeight).toBe(300);
|
|
134
|
+
host.remove();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
await it('adds the child size request to the scrollport, natural or minimum', async () => {
|
|
138
|
+
const { el, host } = mount();
|
|
139
|
+
await fill(el, 10);
|
|
140
|
+
// No request is made until one of the two asks for it: GTK only measures the
|
|
141
|
+
// child when `propagate-natural-*` or a NEVER policy does (gtkscrolledwindow.c:1841-1844).
|
|
142
|
+
expect(el.viewport.style.minHeight).toBe('');
|
|
143
|
+
// The NATURAL request is the child's `max-content` size, propagated up.
|
|
144
|
+
el.setAttribute('propagate-natural-height', '');
|
|
145
|
+
expect(el.propagateNaturalHeight).toBe(true);
|
|
146
|
+
expect(el.viewport.style.minHeight).toBe('max-content');
|
|
147
|
+
// A NEVER policy adds the child's MINIMUM request instead — and the natural one
|
|
148
|
+
// is the larger of the two, so it wins when both are asked for. Both are FALSE in
|
|
149
|
+
// the pspec, so their ATTRIBUTE is their presence, as `has-frame` is.
|
|
150
|
+
el.removeAttribute('propagate-natural-height');
|
|
151
|
+
el.setAttribute('vscrollbar-policy', 'never');
|
|
152
|
+
expect(el.viewport.style.minHeight).toBe('min-content');
|
|
153
|
+
// With both asked for on ONE axis the natural wins, and the other axis keeps
|
|
154
|
+
// its own answer.
|
|
155
|
+
el.setAttribute('propagate-natural-width', '');
|
|
156
|
+
expect(el.viewport.style.minWidth).toBe('max-content');
|
|
157
|
+
expect(el.viewport.style.minHeight).toBe('min-content');
|
|
158
|
+
el.setAttribute('propagate-natural-height', '');
|
|
159
|
+
expect(el.viewport.style.minHeight).toBe('max-content');
|
|
160
|
+
host.remove();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
await describe('<gtk-scrolled-window> scrolling it', async () => {
|
|
165
|
+
await it('moves the position with the keys class_init binds, and emits scroll-child', async () => {
|
|
166
|
+
const { el, host } = mount();
|
|
167
|
+
await fill(el, 10);
|
|
168
|
+
const seen = record(el, 'scroll-child');
|
|
169
|
+
el.focus();
|
|
170
|
+
// Ctrl+ArrowDown is a vertical STEP, and the bare pair is not bound at all.
|
|
171
|
+
press(el, 'ArrowDown');
|
|
172
|
+
expect(el.viewport.vadjustment.value).toBe(0);
|
|
173
|
+
press(el, 'ArrowDown', { ctrlKey: true });
|
|
174
|
+
expect(el.viewport.vadjustment.value).toBe(10);
|
|
175
|
+
press(el, 'PageDown');
|
|
176
|
+
expect(el.viewport.vadjustment.value).toBe(100);
|
|
177
|
+
press(el, 'End', { ctrlKey: true });
|
|
178
|
+
// Ctrl+End is the HORIZONTAL end, and `may_hscroll` is false — nothing scrolls
|
|
179
|
+
// sideways here — so no third `scroll-child` is emitted. Two events, not three.
|
|
180
|
+
expect(el.viewport.hadjustment.value).toBe(0);
|
|
181
|
+
expect(seen.length).toBe(2);
|
|
182
|
+
expect((seen[0] as { scroll: string }).scroll).toBe('step-forward');
|
|
183
|
+
expect((seen[0] as { horizontal: boolean }).horizontal).toBe(false);
|
|
184
|
+
expect((seen[1] as { scroll: string }).scroll).toBe('page-forward');
|
|
185
|
+
host.remove();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
await it('binds Home and End bare as well, on the vertical axis', async () => {
|
|
189
|
+
const { el, host } = mount();
|
|
190
|
+
await fill(el, 10);
|
|
191
|
+
const seen = record(el, 'scroll-child');
|
|
192
|
+
el.focus();
|
|
193
|
+
// Home and End are bound TWICE (gtkscrolledwindow.c:904-907): bare for the
|
|
194
|
+
// VERTICAL axis and with CONTROL for the horizontal one. Dropping the bare pair
|
|
195
|
+
// would leave both dead on the only axis a window usually scrolls.
|
|
196
|
+
el.viewport.scrollAxis('vertical', 120);
|
|
197
|
+
press(el, 'End');
|
|
198
|
+
expect(el.viewport.vadjustment.value).toBe(300);
|
|
199
|
+
expect((seen[0] as { scroll: string }).scroll).toBe('end');
|
|
200
|
+
expect((seen[0] as { horizontal: boolean }).horizontal).toBe(false);
|
|
201
|
+
press(el, 'Home');
|
|
202
|
+
expect(el.viewport.vadjustment.value).toBe(0);
|
|
203
|
+
expect((seen[1] as { scroll: string }).scroll).toBe('start');
|
|
204
|
+
expect((seen[1] as { horizontal: boolean }).horizontal).toBe(false);
|
|
205
|
+
host.remove();
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
await it('emits move-focus-out for Ctrl+Tab, which GTK hands to the root', async () => {
|
|
209
|
+
const { el, host } = mount();
|
|
210
|
+
const seen = record(el, 'move-focus-out');
|
|
211
|
+
press(el, 'Tab', { ctrlKey: true, shiftKey: true });
|
|
212
|
+
expect(seen.length).toBe(1);
|
|
213
|
+
// `toEqual` compares with `==` in this runner, so a detail object is read field by
|
|
214
|
+
// field rather than compared as one value.
|
|
215
|
+
expect((seen[0] as { directionType: string }).directionType).toBe('backward');
|
|
216
|
+
host.remove();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
await it('announces edge-reached when the position lands on a limit', async () => {
|
|
220
|
+
const { el, host } = mount();
|
|
221
|
+
await fill(el, 10);
|
|
222
|
+
const seen = record(el, 'edge-reached');
|
|
223
|
+
el.focus();
|
|
224
|
+
// A page is 90% of the window, so it takes a few of them to reach the far edge —
|
|
225
|
+
// and only the move that LANDS on the limit emits, which is what
|
|
226
|
+
// `maybe_emit_edge_reached` checks.
|
|
227
|
+
for (let i = 0; i < 6; i++) press(el, 'PageDown');
|
|
228
|
+
const edges = seen.map((detail) => (detail as { pos: string }).pos);
|
|
229
|
+
expect(edges.includes('bottom')).toBe(true);
|
|
230
|
+
expect(edges.includes('top')).toBe(false);
|
|
231
|
+
el.viewport.scrollAxis('vertical', 0);
|
|
232
|
+
expect(seen.map((detail) => (detail as { pos: string }).pos).includes('top')).toBe(true);
|
|
233
|
+
host.remove();
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await it('drives the bar from the position, and the position from the bar', async () => {
|
|
237
|
+
const { el, host } = mount();
|
|
238
|
+
await fill(el, 10);
|
|
239
|
+
const bar = bars(el).vertical;
|
|
240
|
+
// A bar that is dragged is a viewport that scrolls: one writer per side.
|
|
241
|
+
(bar as unknown as { value: number }).value = 120;
|
|
242
|
+
expect(el.viewport.vadjustment.value).toBe(120);
|
|
243
|
+
el.viewport.scrollAxis('vertical', 60);
|
|
244
|
+
expect((bar as unknown as { value: number }).value).toBe(60);
|
|
245
|
+
host.remove();
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
await it('marks the edge indicators on the viewport, which is where the shading lives', async () => {
|
|
249
|
+
const { el, host } = mount();
|
|
250
|
+
await fill(el, 10);
|
|
251
|
+
const seen = record(el, 'edge-overshot');
|
|
252
|
+
// The shading controller reads the wheel deltas a clamped scrollport threw away,
|
|
253
|
+
// so a wheel past the end is what publishes `edge-overshot`.
|
|
254
|
+
el.viewport.scrollAxis('vertical', 100000);
|
|
255
|
+
el.viewport.dispatchEvent(new WheelEvent('wheel', { deltaY: 400, bubbles: true, cancelable: true }));
|
|
256
|
+
const overshots = seen.map((detail) => (detail as { pos: string }).pos);
|
|
257
|
+
expect(overshots.length > 0).toBe(true);
|
|
258
|
+
expect(overshots.includes('bottom')).toBe(true);
|
|
259
|
+
host.remove();
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
};
|