@gjsify/adwaita-web 0.54.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 +8066 -3033
- 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 +1 -1
- 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/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,443 @@
|
|
|
1
|
+
// DOM-level tests for <adw-tab-overview>: the thumbnail grid that covers a tab view.
|
|
2
|
+
//
|
|
3
|
+
// The search rows are driven by the SAME table the core suite asserts against
|
|
4
|
+
// (`TAB_SEARCH_VECTORS`), because the predicate is `AdwTabGrid`'s three
|
|
5
|
+
// `GtkStringFilter`s and a browser-only copy of it is exactly the drift the table
|
|
6
|
+
// exists to stop. The rest are the C rules that are easy to get wrong: the PLURAL
|
|
7
|
+
// title, `update_header_bar`'s four-way OR, `empty_changed_cb`'s two empty states,
|
|
8
|
+
// the search entry going to the PINNED grid first, and the close-on-activate rule.
|
|
9
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
GRID_NAVIGATION_GEOMETRY,
|
|
13
|
+
GRID_NAVIGATION_VECTORS,
|
|
14
|
+
TAB_SEARCH_VECTORS,
|
|
15
|
+
} from '@gjsify/adwaita-core/conformance';
|
|
16
|
+
import { tabSearchMatches } from '@gjsify/adwaita-core';
|
|
17
|
+
|
|
18
|
+
import type { AdwTabOverview } from './elements/adw-tab-overview.js';
|
|
19
|
+
import type { AdwTabView } from './elements/adw-tab-view.js';
|
|
20
|
+
|
|
21
|
+
let serial = 0;
|
|
22
|
+
|
|
23
|
+
function mount(options: { pages?: number; pinned?: boolean; attrs?: string } = {}): {
|
|
24
|
+
overview: AdwTabOverview;
|
|
25
|
+
view: AdwTabView;
|
|
26
|
+
host: HTMLElement;
|
|
27
|
+
} {
|
|
28
|
+
const count = options.pages ?? 3;
|
|
29
|
+
const rows = Array.from({ length: count }, (_, i) => {
|
|
30
|
+
const pinned = options.pinned !== undefined && i < (options.pinned ? 1 : 0);
|
|
31
|
+
return `<adw-tab-page title="Page ${i}"${pinned ? ' pinned' : ''}></adw-tab-page>`;
|
|
32
|
+
}).join('');
|
|
33
|
+
const host = document.createElement('div');
|
|
34
|
+
host.innerHTML = `<adw-tab-overview ${options.attrs ?? ''}><adw-tab-view>${rows}</adw-tab-view></adw-tab-overview>`;
|
|
35
|
+
// A box, because `.focus()` on a zero-height element is a no-op in Firefox and the
|
|
36
|
+
// keyboard rules below are exactly what is under test.
|
|
37
|
+
(host.querySelector('adw-tab-overview') as HTMLElement).style.cssText = 'width: 400px; height: 300px;';
|
|
38
|
+
document.body.appendChild(host);
|
|
39
|
+
return {
|
|
40
|
+
overview: host.querySelector('adw-tab-overview') as AdwTabOverview,
|
|
41
|
+
view: host.querySelector('adw-tab-view') as AdwTabView,
|
|
42
|
+
host,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const grid = (overview: AdwTabOverview, pinned = false): HTMLElement =>
|
|
47
|
+
overview.querySelector(pinned ? '.adw-tab-grid.pinned-grid' : '.adw-tab-grid:not(.pinned-grid)') as HTMLElement;
|
|
48
|
+
|
|
49
|
+
const thumbs = (overview: AdwTabOverview, pinned = false): HTMLElement[] =>
|
|
50
|
+
Array.from(grid(overview, pinned).querySelectorAll('.adw-tab-thumbnail'));
|
|
51
|
+
|
|
52
|
+
const searchEntry = (overview: AdwTabOverview): HTMLInputElement =>
|
|
53
|
+
overview.querySelector('.overview-search-entry') as HTMLInputElement;
|
|
54
|
+
|
|
55
|
+
export const AdwTabOverviewTest = async () => {
|
|
56
|
+
await describe('<adw-tab-overview> thumbnail grids', async () => {
|
|
57
|
+
await it('finds the tab view among its own children and shows one thumbnail per page', async () => {
|
|
58
|
+
const { overview, view, host } = mount({ pages: 3 });
|
|
59
|
+
expect(overview.view).toBe(view);
|
|
60
|
+
expect(thumbs(overview)).toHaveLength(3);
|
|
61
|
+
expect((thumbs(overview)[1].querySelector('.tab-label') as HTMLElement).textContent).toBe('Page 1');
|
|
62
|
+
host.remove();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await it('splits PINNED pages into the pinned grid, in view order', async () => {
|
|
66
|
+
const { overview, host } = mount({ pages: 3, pinned: true });
|
|
67
|
+
expect(thumbs(overview, true)).toHaveLength(1);
|
|
68
|
+
expect(thumbs(overview)).toHaveLength(2);
|
|
69
|
+
host.remove();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await it('follows pages attached, detached and repinned', async () => {
|
|
73
|
+
const { overview, view, host } = mount({ pages: 2 });
|
|
74
|
+
view.appendPage({ id: 'late', title: 'Late' });
|
|
75
|
+
expect(thumbs(overview)).toHaveLength(3);
|
|
76
|
+
view.setPagePinned('late', true);
|
|
77
|
+
expect(thumbs(overview, true)).toHaveLength(1);
|
|
78
|
+
expect(thumbs(overview)).toHaveLength(2);
|
|
79
|
+
// `close_page_cb` DENIES a pinned page, which is why its thumbnail carries the
|
|
80
|
+
// unpin mark instead of a close button. Nothing leaves until it is unpinned.
|
|
81
|
+
view.closePage('late');
|
|
82
|
+
expect(view.nPages).toBe(3);
|
|
83
|
+
view.setPagePinned('late', false);
|
|
84
|
+
view.closePage('late');
|
|
85
|
+
expect(thumbs(overview, true)).toHaveLength(0);
|
|
86
|
+
expect(thumbs(overview)).toHaveLength(2);
|
|
87
|
+
host.remove();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
await it('selects the page and closes the overview when a thumbnail is activated', async () => {
|
|
91
|
+
const { overview, view, host } = mount({ pages: 3 });
|
|
92
|
+
overview.setOpen(true);
|
|
93
|
+
thumbs(overview)[2].click();
|
|
94
|
+
expect(view.selectedId).toBe('tab-3');
|
|
95
|
+
expect(overview.open).toBe(false);
|
|
96
|
+
host.remove();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
await it('closes the page from the thumbnail close button, without activating it', async () => {
|
|
100
|
+
const { overview, view, host } = mount({ pages: 3 });
|
|
101
|
+
overview.setOpen(true);
|
|
102
|
+
const closeBtn = thumbs(overview)[0].querySelector('.tab-close-button') as HTMLButtonElement;
|
|
103
|
+
expect(closeBtn.hidden).toBe(false);
|
|
104
|
+
closeBtn.click();
|
|
105
|
+
expect(view.nPages).toBe(2);
|
|
106
|
+
// The button swallowed the click: the overview did NOT close, which is the
|
|
107
|
+
// difference from activating the thumbnail itself. The selection moving to
|
|
108
|
+
// `tab-2` is `Adw.TabView`'s own close-successor rule, not the button.
|
|
109
|
+
expect(overview.open).toBe(true);
|
|
110
|
+
expect(view.selectedId).toBe('tab-2');
|
|
111
|
+
host.remove();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await it('shows the unpin affordance on a pinned thumbnail instead of the close button', async () => {
|
|
115
|
+
const { overview, host } = mount({ pages: 1, pinned: true });
|
|
116
|
+
const thumb = thumbs(overview, true)[0];
|
|
117
|
+
expect((thumb.querySelector('.tab-close-button') as HTMLElement).hidden).toBe(true);
|
|
118
|
+
const unpin = thumb.querySelector('.tab-unpin-icon') as HTMLElement;
|
|
119
|
+
expect(unpin.hidden).toBe(false);
|
|
120
|
+
unpin.click();
|
|
121
|
+
expect(thumbs(overview, true)).toHaveLength(0);
|
|
122
|
+
expect(thumbs(overview)).toHaveLength(1);
|
|
123
|
+
host.remove();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
await it('swaps the thumbnail icon for a spinner while the page is loading', async () => {
|
|
127
|
+
const { overview, view, host } = mount({ pages: 1 });
|
|
128
|
+
const thumb = thumbs(overview)[0];
|
|
129
|
+
const iconTitle = (thumb.querySelector('.icon-title-box') as HTMLElement).firstElementChild as HTMLElement;
|
|
130
|
+
expect(iconTitle.localName).toBe('gtk-image');
|
|
131
|
+
view.setPageLoading('tab-1', true);
|
|
132
|
+
expect((thumb.querySelector('.icon-title-box') as HTMLElement).firstElementChild?.localName).toBe(
|
|
133
|
+
'adw-spinner',
|
|
134
|
+
);
|
|
135
|
+
view.setPageLoading('tab-1', false);
|
|
136
|
+
expect((thumb.querySelector('.icon-title-box') as HTMLElement).firstElementChild?.localName).toBe(
|
|
137
|
+
'gtk-image',
|
|
138
|
+
);
|
|
139
|
+
host.remove();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
await it('shows the indicator button only for a page that has an indicator icon', async () => {
|
|
143
|
+
const { overview, view, host } = mount({ pages: 1 });
|
|
144
|
+
const indicator = thumbs(overview)[0].querySelector('.tab-indicator') as HTMLElement;
|
|
145
|
+
expect(indicator.hidden).toBe(true);
|
|
146
|
+
view.setPageIndicatorIcon('tab-1', 'dialog-warning');
|
|
147
|
+
expect((thumbs(overview)[0].querySelector('.tab-indicator') as HTMLElement).hidden).toBe(false);
|
|
148
|
+
host.remove();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
await describe('<adw-tab-overview> title, header bar and empty states', async () => {
|
|
153
|
+
await it('pluralises the page count, and only for exactly one page', async () => {
|
|
154
|
+
const { overview, view, host } = mount({ pages: 3 });
|
|
155
|
+
const title = () => (overview.querySelector('.overview-title') as HTMLElement).textContent;
|
|
156
|
+
expect(title()).toBe('3 Tabs');
|
|
157
|
+
view.closePage('tab-3');
|
|
158
|
+
view.closePage('tab-2');
|
|
159
|
+
expect(title()).toBe('1 Tab');
|
|
160
|
+
view.closePage('tab-1');
|
|
161
|
+
expect(title()).toBe('0 Tabs');
|
|
162
|
+
host.remove();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
await it('empties its title when there is no view at all', async () => {
|
|
166
|
+
const host = document.createElement('div');
|
|
167
|
+
host.innerHTML = '<adw-tab-overview></adw-tab-overview>';
|
|
168
|
+
document.body.appendChild(host);
|
|
169
|
+
const overview = host.querySelector('adw-tab-overview') as AdwTabOverview;
|
|
170
|
+
expect(overview.view).toBeNull();
|
|
171
|
+
expect((overview.querySelector('.overview-title') as HTMLElement).textContent).toBe('');
|
|
172
|
+
host.remove();
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
await it('hides the header bar only when search, menu and BOTH title-button sides are off', async () => {
|
|
176
|
+
const { overview, host } = mount({
|
|
177
|
+
pages: 2,
|
|
178
|
+
attrs: 'show-start-title-buttons="false" show-end-title-buttons="false"',
|
|
179
|
+
});
|
|
180
|
+
const header = () => (overview.querySelector('.overview-header-bar') as HTMLElement).hidden;
|
|
181
|
+
expect(header()).toBe(false); // search is still on
|
|
182
|
+
overview.setAttribute('enable-search', 'false');
|
|
183
|
+
expect(header()).toBe(true);
|
|
184
|
+
overview.setAttribute('show-start-title-buttons', 'true');
|
|
185
|
+
expect(header()).toBe(false);
|
|
186
|
+
overview.setAttribute('secondary-menu', JSON.stringify([{ label: 'New Window', action: 'win.new' }]));
|
|
187
|
+
expect(header()).toBe(false);
|
|
188
|
+
overview.setAttribute('show-start-title-buttons', 'false');
|
|
189
|
+
overview.setAttribute('show-end-title-buttons', 'false');
|
|
190
|
+
expect(header()).toBe(false); // the secondary menu is the fourth term
|
|
191
|
+
host.remove();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
await it('shows "No Open Tabs" when empty, and "No Tabs Found" when the search matches nothing', async () => {
|
|
195
|
+
const { overview, view, host } = mount({ pages: 2 });
|
|
196
|
+
const empty = () => (overview.querySelector('.overview-empty-state') as HTMLElement).hidden;
|
|
197
|
+
const searchEmpty = () => (overview.querySelector('.overview-search-empty-state') as HTMLElement).hidden;
|
|
198
|
+
expect(empty()).toBe(true);
|
|
199
|
+
view.closePage('tab-1');
|
|
200
|
+
view.closePage('tab-2');
|
|
201
|
+
expect(empty()).toBe(false);
|
|
202
|
+
expect(searchEmpty()).toBe(true);
|
|
203
|
+
|
|
204
|
+
overview.setOpen(true);
|
|
205
|
+
(overview.querySelector('.search-button') as HTMLButtonElement).click();
|
|
206
|
+
const entry = searchEntry(overview);
|
|
207
|
+
entry.value = 'nothing matches this';
|
|
208
|
+
entry.dispatchEvent(new Event('input'));
|
|
209
|
+
expect(overview.searchActive).toBe(true);
|
|
210
|
+
expect(empty()).toBe(true);
|
|
211
|
+
expect(searchEmpty()).toBe(false);
|
|
212
|
+
host.remove();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
await it('hides the new-tab button while the search is running', async () => {
|
|
216
|
+
const { overview, host } = mount({ pages: 2, attrs: 'enable-new-tab' });
|
|
217
|
+
const button = () => (overview.querySelector('.new-tab-button') as HTMLElement).hidden;
|
|
218
|
+
expect(button()).toBe(false);
|
|
219
|
+
overview.setOpen(true);
|
|
220
|
+
(overview.querySelector('.search-button') as HTMLButtonElement).click();
|
|
221
|
+
const entry = searchEntry(overview);
|
|
222
|
+
entry.value = 'page';
|
|
223
|
+
entry.dispatchEvent(new Event('input'));
|
|
224
|
+
expect(button()).toBe(true);
|
|
225
|
+
host.remove();
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
await describe('<adw-tab-overview> search', async () => {
|
|
230
|
+
await it('drives the same filter the core table pins', async () => {
|
|
231
|
+
for (const vector of TAB_SEARCH_VECTORS) {
|
|
232
|
+
const matches = tabSearchMatches(
|
|
233
|
+
{ title: vector.title, tooltip: vector.tooltip, keyword: vector.keyword },
|
|
234
|
+
vector.terms,
|
|
235
|
+
);
|
|
236
|
+
expect(matches).toBe(vector.matches);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
await it('hides the thumbnails that do not match, on title, tooltip and keyword', async () => {
|
|
241
|
+
const { overview, view, host } = mount({ pages: 3 });
|
|
242
|
+
view.setPageTooltip('tab-2', 'the scratch pad');
|
|
243
|
+
view.setPageKeyword('tab-3', 'https://example.org/history');
|
|
244
|
+
overview.setOpen(true);
|
|
245
|
+
(overview.querySelector('.search-button') as HTMLButtonElement).click();
|
|
246
|
+
const entry = searchEntry(overview);
|
|
247
|
+
|
|
248
|
+
const labels = () =>
|
|
249
|
+
thumbs(overview)
|
|
250
|
+
.map((thumb) => thumb.querySelector('.tab-label')?.textContent ?? '')
|
|
251
|
+
.join(',');
|
|
252
|
+
|
|
253
|
+
entry.value = 'scratch';
|
|
254
|
+
entry.dispatchEvent(new Event('input'));
|
|
255
|
+
expect(labels()).toBe('Page 1');
|
|
256
|
+
|
|
257
|
+
entry.value = 'example.org';
|
|
258
|
+
entry.dispatchEvent(new Event('input'));
|
|
259
|
+
expect(labels()).toBe('Page 2');
|
|
260
|
+
|
|
261
|
+
entry.value = 'page';
|
|
262
|
+
entry.dispatchEvent(new Event('input'));
|
|
263
|
+
expect(thumbs(overview)).toHaveLength(3);
|
|
264
|
+
host.remove();
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
await it('is "active" exactly while the entry is non-empty', async () => {
|
|
268
|
+
const { overview, host } = mount({ pages: 1 });
|
|
269
|
+
overview.setOpen(true);
|
|
270
|
+
(overview.querySelector('.search-button') as HTMLButtonElement).click();
|
|
271
|
+
const entry = searchEntry(overview);
|
|
272
|
+
expect(overview.searchActive).toBe(false);
|
|
273
|
+
entry.value = 'x';
|
|
274
|
+
entry.dispatchEvent(new Event('input'));
|
|
275
|
+
expect(overview.searchActive).toBe(true);
|
|
276
|
+
entry.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
277
|
+
expect(overview.searchActive).toBe(false);
|
|
278
|
+
expect(entry.value).toBe('');
|
|
279
|
+
host.remove();
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
await it('sends Enter to the PINNED grid first, then to the ordinary one', async () => {
|
|
283
|
+
const { overview, host } = mount({ pages: 2 });
|
|
284
|
+
overview.setOpen(true);
|
|
285
|
+
(overview.querySelector('.search-button') as HTMLButtonElement).click();
|
|
286
|
+
const entry = searchEntry(overview);
|
|
287
|
+
entry.value = 'page';
|
|
288
|
+
entry.dispatchEvent(new Event('input'));
|
|
289
|
+
entry.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
|
|
290
|
+
expect(document.activeElement === thumbs(overview)[0]).toBe(true);
|
|
291
|
+
host.remove();
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
await describe('<adw-tab-overview> actions and new tab', async () => {
|
|
296
|
+
await it('enables overview.open only while closed, and overview.close only with pages', async () => {
|
|
297
|
+
const { overview, view, host } = mount({ pages: 2 });
|
|
298
|
+
expect(overview.activateOverviewOpen()).toBe(true);
|
|
299
|
+
expect(overview.open).toBe(true);
|
|
300
|
+
// Already open: the action is disabled, and says so by doing nothing.
|
|
301
|
+
expect(overview.activateOverviewOpen()).toBe(false);
|
|
302
|
+
expect(overview.activateOverviewClose()).toBe(true);
|
|
303
|
+
expect(overview.open).toBe(false);
|
|
304
|
+
view.closePage('tab-1');
|
|
305
|
+
view.closePage('tab-2');
|
|
306
|
+
overview.setOpen(true);
|
|
307
|
+
expect(overview.activateOverviewClose()).toBe(false);
|
|
308
|
+
expect(overview.open).toBe(true);
|
|
309
|
+
host.remove();
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
await it('creates, selects and closes to the new page, focusing its content', async () => {
|
|
313
|
+
const { overview, view, host } = mount({ pages: 1, attrs: 'enable-new-tab' });
|
|
314
|
+
overview.setOpen(true);
|
|
315
|
+
overview.addEventListener('create-tab', (event) => {
|
|
316
|
+
// `appendPage` returns the POSITION the page landed at, not the page — the
|
|
317
|
+
// state the handler must hand back is read off the view.
|
|
318
|
+
const position = view.appendPage({ id: 'fresh', title: 'Fresh' });
|
|
319
|
+
(event as CustomEvent).detail.page = view.pages[position];
|
|
320
|
+
});
|
|
321
|
+
(overview.querySelector('.new-tab-button') as HTMLButtonElement).click();
|
|
322
|
+
expect(view.selectedId).toBe('fresh');
|
|
323
|
+
expect(overview.open).toBe(false);
|
|
324
|
+
host.remove();
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
await it('opens the overview from the open attribute, and reports the change', async () => {
|
|
328
|
+
const { overview, host } = mount({ pages: 1 });
|
|
329
|
+
const seen: boolean[] = [];
|
|
330
|
+
overview.addEventListener('notify::open', (event) => seen.push((event as CustomEvent).detail.open));
|
|
331
|
+
overview.setAttribute('open', '');
|
|
332
|
+
expect(overview.open).toBe(true);
|
|
333
|
+
expect((overview.querySelector('.adw-tab-overview-toolbar') as HTMLElement).hidden).toBe(false);
|
|
334
|
+
overview.setOpen(false);
|
|
335
|
+
expect(seen).toStrictEqual([true, false]);
|
|
336
|
+
host.remove();
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
await it('makes the covered child inert while the overview is up', async () => {
|
|
340
|
+
const { overview, host } = mount({ pages: 1 });
|
|
341
|
+
const child = overview.querySelector('.adw-tab-overview-child') as HTMLElement;
|
|
342
|
+
expect(child.inert).toBe(false);
|
|
343
|
+
overview.setOpen(true);
|
|
344
|
+
expect(child.inert).toBe(true);
|
|
345
|
+
host.remove();
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
await describe('<adw-tab-overview> inverted', async () => {
|
|
350
|
+
await it('puts the close button at the start and the indicator at the end', async () => {
|
|
351
|
+
const { overview, view, host } = mount({ pages: 1 });
|
|
352
|
+
view.setPageIndicatorIcon('tab-1', 'dialog-warning');
|
|
353
|
+
const thumb = () => thumbs(overview)[0];
|
|
354
|
+
expect(thumb().classList.contains('inverted')).toBe(false);
|
|
355
|
+
overview.setAttribute('inverted', '');
|
|
356
|
+
expect(overview.inverted).toBe(true);
|
|
357
|
+
expect(thumb().classList.contains('inverted')).toBe(true);
|
|
358
|
+
host.remove();
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
await describe('<adw-tab-overview> grid keyboard', async () => {
|
|
363
|
+
// Three 100px columns in a 340px flex-wrap box: the layout the keys measure.
|
|
364
|
+
const open = (pages: number) => {
|
|
365
|
+
const m = mount({ pages, attrs: 'open' });
|
|
366
|
+
const el = grid(m.overview);
|
|
367
|
+
el.style.cssText = 'display:flex;flex-wrap:wrap;width:340px';
|
|
368
|
+
const chips = thumbs(m.overview);
|
|
369
|
+
for (const chip of chips) chip.style.cssText = 'width:100px;height:60px';
|
|
370
|
+
const press = (target: HTMLElement, key: string, init: KeyboardEventInit = {}) => {
|
|
371
|
+
const event = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true, ...init });
|
|
372
|
+
target.dispatchEvent(event);
|
|
373
|
+
return event;
|
|
374
|
+
};
|
|
375
|
+
return { ...m, chips, press };
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
await it('every shared grid vector moves the selection as tabled', async () => {
|
|
379
|
+
for (const { key, from, to } of GRID_NAVIGATION_VECTORS) {
|
|
380
|
+
const { view, host, chips, press } = open(GRID_NAVIGATION_GEOMETRY.count);
|
|
381
|
+
view.setSelectedPage(chips[from].dataset.pageId as string);
|
|
382
|
+
chips[from].focus();
|
|
383
|
+
press(chips[from], key);
|
|
384
|
+
const expected = chips[to ?? from].dataset.pageId;
|
|
385
|
+
expect(`${key}@${from}=${view.selectedId}`).toBe(`${key}@${from}=${expected}`);
|
|
386
|
+
host.remove();
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
await it('ArrowDown moves focus and selection one row, ArrowUp back', async () => {
|
|
391
|
+
const { view, host, chips, press } = open(7);
|
|
392
|
+
chips[1].focus();
|
|
393
|
+
expect(press(chips[1], 'ArrowDown').defaultPrevented).toBe(true);
|
|
394
|
+
expect(view.selectedId).toBe(chips[4].dataset.pageId);
|
|
395
|
+
expect(document.activeElement).toBe(chips[4]);
|
|
396
|
+
press(chips[4], 'ArrowUp');
|
|
397
|
+
expect(view.selectedId).toBe(chips[1].dataset.pageId);
|
|
398
|
+
host.remove();
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
await it('Home and End jump to the ends', async () => {
|
|
402
|
+
const { view, host, chips, press } = open(7);
|
|
403
|
+
chips[3].focus();
|
|
404
|
+
press(chips[3], 'End');
|
|
405
|
+
expect(view.selectedId).toBe(chips[6].dataset.pageId);
|
|
406
|
+
press(chips[6], 'Home');
|
|
407
|
+
expect(view.selectedId).toBe(chips[0].dataset.pageId);
|
|
408
|
+
host.remove();
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
await it('Enter selects the focused thumbnail and closes the overview', async () => {
|
|
412
|
+
const { overview, view, host, chips, press } = open(3);
|
|
413
|
+
chips[2].focus();
|
|
414
|
+
expect(press(chips[2], 'Enter').defaultPrevented).toBe(true);
|
|
415
|
+
expect(view.selectedId).toBe(chips[2].dataset.pageId);
|
|
416
|
+
expect(overview.open).toBe(false);
|
|
417
|
+
host.remove();
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
await it('arrows with a modifier are left to the browser', async () => {
|
|
421
|
+
const { view, host, chips, press } = open(3);
|
|
422
|
+
const before = view.selectedId;
|
|
423
|
+
expect(press(chips[0], 'ArrowRight', { ctrlKey: true }).defaultPrevented).toBe(false);
|
|
424
|
+
expect(view.selectedId).toBe(before);
|
|
425
|
+
host.remove();
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
await describe('<adw-tab-overview> serial safety', async () => {
|
|
430
|
+
await it('keeps two overviews apart', async () => {
|
|
431
|
+
serial += 1;
|
|
432
|
+
expect(serial).toBeGreaterThan(0);
|
|
433
|
+
const a = mount({ pages: 1 });
|
|
434
|
+
const b = mount({ pages: 2 });
|
|
435
|
+
expect(a.overview.view).toBe(a.view);
|
|
436
|
+
expect(b.overview.view).toBe(b.view);
|
|
437
|
+
expect(thumbs(a.overview)).toHaveLength(1);
|
|
438
|
+
expect(thumbs(b.overview)).toHaveLength(2);
|
|
439
|
+
a.host.remove();
|
|
440
|
+
b.host.remove();
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
};
|