@gjsify/adwaita-web 0.54.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/adwaita-web.css +8146 -3011
- 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-status-page.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/attributes.d.ts +19 -0
- package/lib/types/breakpoints.d.ts +14 -3
- package/lib/types/construct-vectors.spec.d.ts +1 -0
- package/lib/types/elements/adw-action-row.d.ts +4 -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-combo-row.d.ts +4 -0
- package/lib/types/elements/adw-dialog.d.ts +10 -0
- package/lib/types/elements/adw-entry-row.d.ts +6 -0
- package/lib/types/elements/adw-expander-row.d.ts +2 -0
- package/lib/types/elements/adw-header-bar.d.ts +6 -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-overlay-split-view.d.ts +13 -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 +8 -2
- package/lib/types/elements/adw-spin-row.d.ts +6 -0
- package/lib/types/elements/adw-switch-row.d.ts +7 -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-toggle-group.d.ts +17 -0
- 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 +129 -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 +103 -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/row-line-clamp.d.ts +20 -0
- package/lib/types/row-tooltip.d.ts +8 -0
- package/lib/types/row-tooltip.spec.d.ts +1 -0
- package/lib/types/scroll-shading.d.ts +15 -1
- package/lib/types/shared-tree-builder.d.ts +75 -17
- package/lib/types/shared-tree-mount.spec.d.ts +1 -0
- 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/lib/types/widget-size.spec.d.ts +1 -0
- package/package.json +12 -8
- package/scss/_action_row.scss +41 -17
- 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/_button_row.scss +5 -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/_expander_row.scss +36 -3
- 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 +134 -1
- 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 +60 -0
- package/scss/_print_dialogs.scss +328 -0
- package/scss/_reset.scss +21 -19
- package/scss/_revealer.scss +37 -0
- package/scss/_row.scss +36 -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/_status_page.scss +1 -1
- 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/_toggle_group.scss +28 -0
- 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/_widget.scss +14 -3
- package/scss/_window.scss +131 -2
- package/scss/_window_handle.scss +20 -0
- package/scss/adwaita-skin.scss +109 -0
- package/src/adw-action-rows.spec.ts +331 -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-header-bar.spec.ts +18 -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-status-page.spec.ts +124 -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/attributes.ts +52 -0
- package/src/breakpoints.ts +25 -8
- package/src/capabilities.d.mts +3 -0
- package/src/capabilities.mjs +21 -0
- package/src/connect-lifecycle.spec.ts +12 -0
- package/src/construct-vectors.spec.ts +175 -0
- package/src/elements/adw-action-row.ts +31 -2
- package/src/elements/adw-alert-dialog.ts +4 -1
- 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-button-row.ts +7 -1
- package/src/elements/adw-clamp-scrollable.ts +207 -0
- package/src/elements/adw-combo-row.ts +26 -1
- package/src/elements/adw-dialog.ts +19 -0
- package/src/elements/adw-entry-row.ts +22 -12
- package/src/elements/adw-expander-row.ts +34 -1
- package/src/elements/adw-header-bar.ts +18 -4
- package/src/elements/adw-layout-slot.ts +95 -0
- package/src/elements/adw-multi-layout-view.ts +326 -0
- package/src/elements/adw-overlay-split-view.ts +29 -6
- package/src/elements/adw-preferences-row.ts +153 -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 +74 -7
- package/src/elements/adw-spin-row.ts +37 -2
- package/src/elements/adw-status-page.ts +10 -2
- package/src/elements/adw-switch-row.ts +53 -2
- 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 +138 -14
- 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 +190 -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 +653 -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 +372 -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 +202 -0
- package/src/index.ts +9 -1
- package/src/keyboard-operable.spec.ts +77 -9
- 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/row-line-clamp.ts +74 -0
- package/src/row-tooltip.spec.ts +313 -0
- package/src/row-tooltip.ts +52 -0
- package/src/scroll-shading.ts +18 -1
- package/src/shared-tree-builder.ts +336 -41
- package/src/shared-tree-mount.spec.ts +130 -0
- package/src/shared-trees.spec.ts +15 -0
- 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 +160 -0
- package/src/widget-size.spec.ts +117 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-expander>. What matters is the disclosure itself — the
|
|
2
|
+
// `expanded` flag, the `:checked` state GTK puts on the ARROW node rather than on the
|
|
3
|
+
// widget, the `label` / `label-widget` precedence, and the `Alt`+mnemonic that
|
|
4
|
+
// `gtk_expander_new_with_mnemonic` documents — plus the node tree, because the stylesheet
|
|
5
|
+
// selects on `expander-widget > box > title`.
|
|
6
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
7
|
+
|
|
8
|
+
import type { GtkExpander } from './elements/gtk-expander.js';
|
|
9
|
+
|
|
10
|
+
function mount(
|
|
11
|
+
attrs: Record<string, string> = {},
|
|
12
|
+
labelWidget = false,
|
|
13
|
+
): {
|
|
14
|
+
el: GtkExpander;
|
|
15
|
+
host: HTMLElement;
|
|
16
|
+
} {
|
|
17
|
+
const host = document.createElement('div');
|
|
18
|
+
document.body.appendChild(host);
|
|
19
|
+
host.style.width = '260px';
|
|
20
|
+
const el = document.createElement('gtk-expander') as GtkExpander;
|
|
21
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
22
|
+
if (labelWidget) {
|
|
23
|
+
const badge = document.createElement('span');
|
|
24
|
+
badge.id = 'badge';
|
|
25
|
+
badge.setAttribute('slot', 'label');
|
|
26
|
+
el.appendChild(badge);
|
|
27
|
+
}
|
|
28
|
+
const body = document.createElement('div');
|
|
29
|
+
body.id = 'body';
|
|
30
|
+
body.style.height = '40px';
|
|
31
|
+
el.appendChild(body);
|
|
32
|
+
host.appendChild(el);
|
|
33
|
+
return { el, host };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Collect the `detail` of every `event` dispatched on `el`. */
|
|
37
|
+
function record(el: HTMLElement, event: string): unknown[] {
|
|
38
|
+
const details: unknown[] = [];
|
|
39
|
+
el.addEventListener(event, (e) => details.push((e as CustomEvent).detail));
|
|
40
|
+
return details;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const GtkExpanderTest = async () => {
|
|
44
|
+
await describe('<gtk-expander> disclosure', async () => {
|
|
45
|
+
await it('builds the node tree the stylesheet selects on', () => {
|
|
46
|
+
const { el, host } = mount({ label: 'More options' });
|
|
47
|
+
const box = el.querySelector('.adw-expander-box') as HTMLElement;
|
|
48
|
+
const title = box.querySelector('.adw-expander-title') as HTMLElement;
|
|
49
|
+
expect(box.children[0]).toBe(title);
|
|
50
|
+
expect((box.children[1] as HTMLElement).classList.contains('adw-expander-content')).toBe(true);
|
|
51
|
+
// GTK gives the WIDGET the button role (gtkexpander.c:393) and the arrow is its
|
|
52
|
+
// own node; here the title carries the role because it is what is pressed.
|
|
53
|
+
expect(title.getAttribute('role')).toBe('button');
|
|
54
|
+
expect(title.tabIndex).toBe(0);
|
|
55
|
+
expect((title.firstElementChild as HTMLElement).classList.contains('adw-expander-arrow')).toBe(true);
|
|
56
|
+
host.remove();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await it('starts collapsed with the child out of the box', () => {
|
|
60
|
+
const { el, host } = mount({ label: 'More options' });
|
|
61
|
+
expect(el.expanded).toBe(false);
|
|
62
|
+
const title = el.querySelector('.adw-expander-title') as HTMLElement;
|
|
63
|
+
expect(title.getAttribute('aria-expanded')).toBe('false');
|
|
64
|
+
// `gtk_expander_set_child` parents the child into the box only while expanded
|
|
65
|
+
// (gtkexpander.c:909-923), so a collapsed expander does not lay it out.
|
|
66
|
+
expect((el.querySelector('.adw-expander-content') as HTMLElement).hidden).toBe(true);
|
|
67
|
+
host.remove();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await it('marks the ARROW, not the widget, with :checked', () => {
|
|
71
|
+
const { el, host } = mount({ label: 'More options' });
|
|
72
|
+
const arrow = el.querySelector('.adw-expander-arrow') as HTMLElement;
|
|
73
|
+
expect(arrow.classList.contains('checked')).toBe(false);
|
|
74
|
+
el.expanded = true;
|
|
75
|
+
// gtkexpander.c:897-900 — GTK_STATE_FLAG_CHECKED goes on `arrow_widget`.
|
|
76
|
+
expect(arrow.classList.contains('checked')).toBe(true);
|
|
77
|
+
el.expanded = false;
|
|
78
|
+
expect(arrow.classList.contains('checked')).toBe(false);
|
|
79
|
+
host.remove();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
await it('a click toggles it, notifies once per change, and emits activate', () => {
|
|
83
|
+
const { el, host } = mount({ label: 'More options' });
|
|
84
|
+
const title = el.querySelector('.adw-expander-title') as HTMLElement;
|
|
85
|
+
const expanded = record(el, 'notify::expanded');
|
|
86
|
+
const activated = record(el, 'activate');
|
|
87
|
+
title.click();
|
|
88
|
+
expect(el.expanded).toBe(true);
|
|
89
|
+
title.click();
|
|
90
|
+
expect(el.expanded).toBe(false);
|
|
91
|
+
expect(expanded).toStrictEqual([{ expanded: true }, { expanded: false }]);
|
|
92
|
+
expect(activated).toStrictEqual([{ expanded: true }, { expanded: false }]);
|
|
93
|
+
host.remove();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await it('names the disclosed row for aria-controls', () => {
|
|
97
|
+
const { el, host } = mount({ label: 'More options' });
|
|
98
|
+
const title = el.querySelector('.adw-expander-title') as HTMLElement;
|
|
99
|
+
expect(title.getAttribute('aria-controls')).toBe(el.child?.id);
|
|
100
|
+
expect(el.child?.id).not.toBe('');
|
|
101
|
+
host.remove();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
await describe('<gtk-expander> label', async () => {
|
|
106
|
+
await it('makes the text a GtkLabel, as gtk_expander_set_label does', () => {
|
|
107
|
+
const { el, host } = mount({ label: '_More options', 'use-underline': '' });
|
|
108
|
+
const label = el.querySelector('.adw-expander-title > gtk-label') as HTMLElement;
|
|
109
|
+
expect(el.label).toBe('_More options');
|
|
110
|
+
// The very reduction `<gtk-label>` applies to its own `label`, so the expander's
|
|
111
|
+
// title and a bare label show the same string.
|
|
112
|
+
expect(label.getAttribute('label')).toBe('More options');
|
|
113
|
+
expect(label.getAttribute('use-underline')).toBe('');
|
|
114
|
+
host.remove();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
await it('leaves markup alone unless use-markup says otherwise', () => {
|
|
118
|
+
const { el, host } = mount({ label: '<b>Bold</b> options' });
|
|
119
|
+
const label = el.querySelector('.adw-expander-title > gtk-label') as HTMLElement;
|
|
120
|
+
expect(label.getAttribute('label')).toBe('<b>Bold</b> options');
|
|
121
|
+
el.useMarkup = true;
|
|
122
|
+
expect(label.getAttribute('use-markup')).toBe('');
|
|
123
|
+
expect(label.getAttribute('label')).toBe('Bold options');
|
|
124
|
+
host.remove();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
await it("a label widget takes the place of the text, as the C's NULL label does", () => {
|
|
128
|
+
const { el, host } = mount({ label: 'More options' }, true);
|
|
129
|
+
expect(el.labelWidget?.id).toBe('badge');
|
|
130
|
+
// `gtk_expander_set_label` NULLs the label widget (gtkexpander.c:969-970), so
|
|
131
|
+
// the two are mutually exclusive and the widget wins.
|
|
132
|
+
expect(el.label).toBe(null);
|
|
133
|
+
expect((el.querySelector('.adw-expander-title > gtk-label') as HTMLElement).hidden).toBe(true);
|
|
134
|
+
host.remove();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
await it('Alt plus the marked character activates, as the constructor documents', () => {
|
|
138
|
+
const { el, host } = mount({ label: '_More options', 'use-underline': '' });
|
|
139
|
+
const title = el.querySelector('.adw-expander-title') as HTMLElement;
|
|
140
|
+
title.dispatchEvent(new KeyboardEvent('keydown', { key: 'm', altKey: true, bubbles: true }));
|
|
141
|
+
expect(el.expanded).toBe(true);
|
|
142
|
+
title.dispatchEvent(new KeyboardEvent('keydown', { key: 'z', altKey: true, bubbles: true }));
|
|
143
|
+
// `gtk_label_get_mnemonic_keyval` binds the FIRST marked character only.
|
|
144
|
+
expect(el.expanded).toBe(true);
|
|
145
|
+
title.dispatchEvent(new KeyboardEvent('keydown', { key: 'm', bubbles: true }));
|
|
146
|
+
expect(el.expanded).toBe(true);
|
|
147
|
+
host.remove();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
await it('an escaped __ marks nothing, exactly as stripMnemonic reads it', () => {
|
|
151
|
+
const { el, host } = mount({ label: '__More _options', 'use-underline': '' });
|
|
152
|
+
const title = el.querySelector('.adw-expander-title') as HTMLElement;
|
|
153
|
+
expect(title.querySelector('gtk-label')?.getAttribute('label')).toBe('_More options');
|
|
154
|
+
title.dispatchEvent(new KeyboardEvent('keydown', { key: 'o', altKey: true, bubbles: true }));
|
|
155
|
+
expect(el.expanded).toBe(true);
|
|
156
|
+
host.remove();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
await describe('<gtk-expander> resize-toplevel', async () => {
|
|
161
|
+
await it('is reflected, because a document reflows itself', () => {
|
|
162
|
+
const { el, host } = mount({ label: 'More', 'resize-toplevel': '' });
|
|
163
|
+
expect(el.resizeToplevel).toBe(true);
|
|
164
|
+
expect(el.classList.contains('resize-toplevel')).toBe(true);
|
|
165
|
+
el.resizeToplevel = false;
|
|
166
|
+
expect(el.classList.contains('resize-toplevel')).toBe(false);
|
|
167
|
+
host.remove();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-fixed>: the children are out of flow at pixel offsets, an
|
|
2
|
+
// unpositioned one is at 0, 0 as GtkBuilder puts it, and the fixed's own box is the UNION
|
|
3
|
+
// of its children's rectangles — `gtk_fixed_layout_measure` in one number per axis.
|
|
4
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
5
|
+
|
|
6
|
+
import type { GtkFixed } from './elements/gtk-fixed.js';
|
|
7
|
+
|
|
8
|
+
/** A fixed-size box, so the union below is arithmetic and not a measurement of text. */
|
|
9
|
+
function cell(x: number, y: number, width: number, height: number): HTMLElement {
|
|
10
|
+
const el = document.createElement('div');
|
|
11
|
+
el.style.width = `${width}px`;
|
|
12
|
+
el.style.height = `${height}px`;
|
|
13
|
+
if (x !== 0 || y !== 0) {
|
|
14
|
+
el.style.left = `${x}px`;
|
|
15
|
+
el.style.top = `${y}px`;
|
|
16
|
+
}
|
|
17
|
+
return el;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function mount(...children: HTMLElement[]): { el: GtkFixed; host: HTMLElement } {
|
|
21
|
+
const host = document.createElement('div');
|
|
22
|
+
document.body.appendChild(host);
|
|
23
|
+
const el = document.createElement('gtk-fixed') as GtkFixed;
|
|
24
|
+
el.append(...children);
|
|
25
|
+
host.appendChild(el);
|
|
26
|
+
return { el, host };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const GtkFixedTest = async () => {
|
|
30
|
+
await describe('<gtk-fixed> placement', async () => {
|
|
31
|
+
await it('takes a child out of flow and leaves an unpositioned one at 0, 0', () => {
|
|
32
|
+
const { el, host } = mount(cell(0, 0, 40, 10));
|
|
33
|
+
const style = getComputedStyle(el.firstElementChild as HTMLElement);
|
|
34
|
+
expect(style.position).toBe('absolute');
|
|
35
|
+
expect(style.left).toBe('0px');
|
|
36
|
+
expect(style.top).toBe('0px');
|
|
37
|
+
expect(getComputedStyle(el).position).toBe('relative');
|
|
38
|
+
host.remove();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await it('put() writes the offset the child sits at', () => {
|
|
42
|
+
const { el, host } = mount(cell(0, 0, 40, 10));
|
|
43
|
+
const child = el.firstElementChild as HTMLElement;
|
|
44
|
+
el.put(child, 20, 30);
|
|
45
|
+
expect(child.style.left).toBe('20px');
|
|
46
|
+
expect(child.style.top).toBe('30px');
|
|
47
|
+
// move() is the same without the parent change.
|
|
48
|
+
el.move(child, 5, 6);
|
|
49
|
+
expect(child.style.left).toBe('5px');
|
|
50
|
+
host.remove();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
await it('put() adopts a child that is not in it yet', () => {
|
|
54
|
+
const { el, host } = mount();
|
|
55
|
+
const late = cell(0, 0, 20, 20);
|
|
56
|
+
document.body.appendChild(late);
|
|
57
|
+
el.put(late, 8, 9);
|
|
58
|
+
expect(late.parentNode).toBe(el);
|
|
59
|
+
expect(late.style.left).toBe('8px');
|
|
60
|
+
host.remove();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
await describe('<gtk-fixed> size', async () => {
|
|
65
|
+
await it("is the union of its children's rectangles", () => {
|
|
66
|
+
const { el, host } = mount(cell(20, 10, 60, 20), cell(10, 30, 40, 15));
|
|
67
|
+
// MAX (x + width) = 80 and MAX (y + height) = 45 over the two children.
|
|
68
|
+
expect(el.style.minWidth).toBe('80px');
|
|
69
|
+
expect(el.style.minHeight).toBe('45px');
|
|
70
|
+
host.remove();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await it('an empty fixed asks for nothing', () => {
|
|
74
|
+
const { el, host } = mount();
|
|
75
|
+
expect(el.style.minWidth).toBe('0px');
|
|
76
|
+
expect(el.style.minHeight).toBe('0px');
|
|
77
|
+
host.remove();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
await it('a child added after connect is in the next union', async () => {
|
|
81
|
+
const { el, host } = mount(cell(0, 0, 30, 30));
|
|
82
|
+
expect(el.style.minWidth).toBe('30px');
|
|
83
|
+
el.appendChild(cell(70, 0, 30, 30));
|
|
84
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 0));
|
|
85
|
+
expect(el.style.minWidth).toBe('100px');
|
|
86
|
+
host.remove();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
await it('clips like GTK_OVERFLOW_HIDDEN, and is a block that holds a position', () => {
|
|
90
|
+
const { el, host } = mount(cell(0, 0, 10, 10));
|
|
91
|
+
const style = getComputedStyle(el);
|
|
92
|
+
expect(style.overflow).toBe('hidden');
|
|
93
|
+
expect(style.display).toBe('block');
|
|
94
|
+
host.remove();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
};
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// DOM-level tests for <gtk-flow-box>: the cells it collects, the four state flags it derives
|
|
2
|
+
// for each, the horizontal-by-default orientation, and the property doors the flex layout reads.
|
|
3
|
+
//
|
|
4
|
+
// The SELECTION RULES are the same core module `<gtk-list-box>` drives and
|
|
5
|
+
// `box-selection.spec.ts` holds them to, so this suite does not re-run the tables — it runs
|
|
6
|
+
// the two places the flow box is its OWN code: the orientation, which flips the line the
|
|
7
|
+
// primary arrows walk, and the layout properties, which are what the arrows' visual step is
|
|
8
|
+
// measured against.
|
|
9
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
10
|
+
|
|
11
|
+
import type { GtkFlowBox } from './elements/gtk-flow-box.js';
|
|
12
|
+
import type { GtkFlowBoxChild } from './elements/gtk-flow-box-child.js';
|
|
13
|
+
|
|
14
|
+
const CELLS = 9;
|
|
15
|
+
|
|
16
|
+
function mount(attrs: Record<string, string> = {}): { el: GtkFlowBox; host: HTMLElement } {
|
|
17
|
+
const host = document.createElement('div');
|
|
18
|
+
document.body.appendChild(host);
|
|
19
|
+
const el = document.createElement('gtk-flow-box') as GtkFlowBox;
|
|
20
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
21
|
+
for (let index = 0; index < CELLS; index++) {
|
|
22
|
+
const child = document.createElement('gtk-flow-box-child') as GtkFlowBoxChild;
|
|
23
|
+
const text = document.createElement('span');
|
|
24
|
+
text.textContent = `cell ${index}`;
|
|
25
|
+
child.appendChild(text);
|
|
26
|
+
el.appendChild(child);
|
|
27
|
+
}
|
|
28
|
+
host.appendChild(el);
|
|
29
|
+
return { el, host };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const childrenOf = (el: GtkFlowBox): GtkFlowBoxChild[] =>
|
|
33
|
+
[...el.querySelectorAll('gtk-flow-box-child')] as GtkFlowBoxChild[];
|
|
34
|
+
const selectedFlags = (el: GtkFlowBox): boolean[] =>
|
|
35
|
+
childrenOf(el).map((child) => child.classList.contains('selected'));
|
|
36
|
+
const click = (target: Element, init: MouseEventInit = {}) =>
|
|
37
|
+
target.dispatchEvent(new MouseEvent('click', { bubbles: true, detail: 1, ...init }));
|
|
38
|
+
const key = (target: Element, init: KeyboardEventInit) =>
|
|
39
|
+
target.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, ...init }));
|
|
40
|
+
|
|
41
|
+
export const GtkFlowBoxTest = async () => {
|
|
42
|
+
await describe('<gtk-flow-box> orientation, and the default nobody expects', async () => {
|
|
43
|
+
await it('is HORIZONTAL by default, where a GtkListBase is vertical', async () => {
|
|
44
|
+
// gtkflowbox.c:3981 — `priv->orientation = GTK_ORIENTATION_HORIZONTAL`, against
|
|
45
|
+
// gtklistbase.c:2070 which answers VERTICAL for every list view.
|
|
46
|
+
const { el, host } = mount();
|
|
47
|
+
expect(el.orientation).toBe('horizontal');
|
|
48
|
+
expect(el.classList.contains('vertical')).toBe(false);
|
|
49
|
+
expect(globalThis.getComputedStyle(el).flexDirection).toBe('row');
|
|
50
|
+
el.orientation = 'vertical';
|
|
51
|
+
expect(el.classList.contains('vertical')).toBe(true);
|
|
52
|
+
host.remove();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
await it('declares a grid of gridcells, and multiselectable only in multiple', () => {
|
|
56
|
+
const { el, host } = mount();
|
|
57
|
+
expect(el.getAttribute('role')).toBe('grid');
|
|
58
|
+
expect(childrenOf(el)[0]!.getAttribute('role')).toBe('gridcell');
|
|
59
|
+
expect(el.getAttribute('aria-multiselectable')).toBe(null);
|
|
60
|
+
el.selectionMode = 'multiple';
|
|
61
|
+
expect(el.getAttribute('aria-multiselectable')).toBe('true');
|
|
62
|
+
host.remove();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await it('is a readonly grid in selection-mode none', () => {
|
|
66
|
+
const { el, host } = mount({ 'selection-mode': 'none' });
|
|
67
|
+
expect(el.getAttribute('aria-readonly')).toBe('true');
|
|
68
|
+
expect(childrenOf(el).every((child) => child.hasAttribute('aria-selected'))).toBe(false);
|
|
69
|
+
el.selectionMode = 'single';
|
|
70
|
+
expect(el.hasAttribute('aria-readonly')).toBe(false);
|
|
71
|
+
host.remove();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await describe('<gtk-flow-box> the layout properties the flex rules read', async () => {
|
|
76
|
+
await it("defaults max-children-per-line to GTK's own seven", () => {
|
|
77
|
+
// DEFAULT_MAX_CHILDREN_PER_LINE (gtkflowbox.c:728, :3985).
|
|
78
|
+
const { el, host } = mount();
|
|
79
|
+
expect(el.maxChildrenPerLine).toBe(7);
|
|
80
|
+
host.remove();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
await it('never lets max-children-per-line fall below the ParamSpec minimum of 1', () => {
|
|
84
|
+
const { el, host } = mount();
|
|
85
|
+
el.maxChildrenPerLine = 0;
|
|
86
|
+
expect(el.maxChildrenPerLine).toBe(1);
|
|
87
|
+
el.setAttribute('max-children-per-line', 'not-a-number');
|
|
88
|
+
expect(el.maxChildrenPerLine).toBe(7);
|
|
89
|
+
host.remove();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
await it('keeps min-children-per-line at zero unless asked, which is the GIR default', () => {
|
|
93
|
+
const { el, host } = mount();
|
|
94
|
+
expect(el.minChildrenPerLine).toBe(0);
|
|
95
|
+
expect(el.style.getPropertyValue('--adw-flow-box-min-children-per-line')).toBe('');
|
|
96
|
+
el.minChildrenPerLine = 3;
|
|
97
|
+
expect(el.style.getPropertyValue('--adw-flow-box-min-children-per-line')).toBe('3');
|
|
98
|
+
host.remove();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
await it('writes the two spacings as custom properties, in pixels', () => {
|
|
102
|
+
const { el, host } = mount({ 'row-spacing': '6', 'column-spacing': '12' });
|
|
103
|
+
expect(el.rowSpacing).toBe(6);
|
|
104
|
+
expect(el.columnSpacing).toBe(12);
|
|
105
|
+
expect(el.style.getPropertyValue('--adw-flow-box-row-spacing')).toBe('6px');
|
|
106
|
+
expect(el.style.getPropertyValue('--adw-flow-box-column-spacing')).toBe('12px');
|
|
107
|
+
host.remove();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
await it('reads a broken spacing as the GIR default of zero', () => {
|
|
111
|
+
const { el, host } = mount();
|
|
112
|
+
el.setAttribute('row-spacing', '-4');
|
|
113
|
+
expect(el.rowSpacing).toBe(0);
|
|
114
|
+
el.setAttribute('row-spacing', '');
|
|
115
|
+
expect(el.rowSpacing).toBe(0);
|
|
116
|
+
host.remove();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
await it('caps a cell at its share of the line, so max-children-per-line caps the line', () => {
|
|
120
|
+
const { el, host } = mount({ 'max-children-per-line': '3' });
|
|
121
|
+
const child = childrenOf(el)[0]!;
|
|
122
|
+
// The stylesheet computes `max-width: calc(100% / 3)` from the custom property, so
|
|
123
|
+
// the resolved value on the cell is what the count produced.
|
|
124
|
+
expect(el.style.getPropertyValue('--adw-flow-box-max-children-per-line')).toBe('3');
|
|
125
|
+
expect(child.style.getPropertyValue('--adw-flow-box-max-children-per-line')).toBe('');
|
|
126
|
+
host.remove();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
await describe('<gtk-flow-box> selection', async () => {
|
|
131
|
+
await it('a click selects and the class follows the selection', () => {
|
|
132
|
+
const { el, host } = mount();
|
|
133
|
+
click(childrenOf(el)[3]!);
|
|
134
|
+
expect(el.selectedChildren).toStrictEqual([3]);
|
|
135
|
+
expect(selectedFlags(el)).toStrictEqual([false, false, false, true, false, false, false, false, false]);
|
|
136
|
+
expect(childrenOf(el)[3]!.getAttribute('aria-selected')).toBe('true');
|
|
137
|
+
host.remove();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
await it('Ctrl+click toggles in multiple mode and keeps the anchor', () => {
|
|
141
|
+
const { el, host } = mount({ 'selection-mode': 'multiple' });
|
|
142
|
+
click(childrenOf(el)[1]!);
|
|
143
|
+
click(childrenOf(el)[5]!, { ctrlKey: true });
|
|
144
|
+
expect(el.selectedChildren).toStrictEqual([1, 5]);
|
|
145
|
+
click(childrenOf(el)[5]!, { ctrlKey: true });
|
|
146
|
+
expect(el.selectedChildren).toStrictEqual([1]);
|
|
147
|
+
host.remove();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
await it('Shift+click takes the span and keeps the anchor, as the C does', () => {
|
|
151
|
+
const { el, host } = mount({ 'selection-mode': 'multiple' });
|
|
152
|
+
click(childrenOf(el)[2]!);
|
|
153
|
+
click(childrenOf(el)[6]!, { shiftKey: true });
|
|
154
|
+
expect(el.selectedChildren).toStrictEqual([2, 3, 4, 5, 6]);
|
|
155
|
+
// A second extend grows the range from the FIRST click, because
|
|
156
|
+
// `priv->selected_child` is left where it was (gtkflowbox.c:1113).
|
|
157
|
+
click(childrenOf(el)[8]!, { shiftKey: true });
|
|
158
|
+
expect(el.selectedChildren).toStrictEqual([2, 3, 4, 5, 6, 7, 8]);
|
|
159
|
+
host.remove();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
await it('clears the selection on Ctrl+click of the selected row in single mode', () => {
|
|
163
|
+
const { el, host } = mount();
|
|
164
|
+
click(childrenOf(el)[4]!);
|
|
165
|
+
click(childrenOf(el)[4]!, { ctrlKey: true });
|
|
166
|
+
expect(el.selectedChildren).toStrictEqual([]);
|
|
167
|
+
host.remove();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
await it('browse keeps a row selected under Ctrl+click, because it has no toggle', () => {
|
|
171
|
+
const { el, host } = mount({ 'selection-mode': 'browse' });
|
|
172
|
+
click(childrenOf(el)[4]!);
|
|
173
|
+
click(childrenOf(el)[4]!, { ctrlKey: true });
|
|
174
|
+
expect(el.selectedChildren).toStrictEqual([4]);
|
|
175
|
+
host.remove();
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
await it('select_all is refused outside multiple, and unselect_all in browse', () => {
|
|
179
|
+
const { el, host } = mount();
|
|
180
|
+
el.selectChild(childrenOf(el)[1]!);
|
|
181
|
+
el.selectAll();
|
|
182
|
+
expect(el.selectedChildren).toStrictEqual([1]);
|
|
183
|
+
el.selectionMode = 'browse';
|
|
184
|
+
el.selectChild(childrenOf(el)[2]!);
|
|
185
|
+
el.unselectAll();
|
|
186
|
+
expect(el.selectedChildren).toStrictEqual([2]);
|
|
187
|
+
host.remove();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
await it('toggles on Ctrl+Space, the toggle-cursor-child binding', () => {
|
|
191
|
+
const { el, host } = mount({ 'selection-mode': 'multiple' });
|
|
192
|
+
const child = childrenOf(el)[2]!;
|
|
193
|
+
child.focus();
|
|
194
|
+
key(child, { key: ' ', ctrlKey: true });
|
|
195
|
+
expect(el.selectedChildren).toStrictEqual([2]);
|
|
196
|
+
key(child, { key: ' ', ctrlKey: true });
|
|
197
|
+
expect(el.selectedChildren).toStrictEqual([]);
|
|
198
|
+
host.remove();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
await it('emits child-activated and activate on one click by default', () => {
|
|
202
|
+
const { el, host } = mount();
|
|
203
|
+
let activated = 0;
|
|
204
|
+
let childActivated = 0;
|
|
205
|
+
el.addEventListener('child-activated', () => {
|
|
206
|
+
childActivated++;
|
|
207
|
+
});
|
|
208
|
+
childrenOf(el)[1]!.addEventListener('activate', () => {
|
|
209
|
+
activated++;
|
|
210
|
+
});
|
|
211
|
+
click(childrenOf(el)[1]!);
|
|
212
|
+
expect(activated).toBe(1);
|
|
213
|
+
expect(childActivated).toBe(1);
|
|
214
|
+
host.remove();
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
await it('waits for a double click when activate-on-single-click is off', () => {
|
|
218
|
+
const { el, host } = mount({ 'activate-on-single-click': 'false' });
|
|
219
|
+
let activated = 0;
|
|
220
|
+
childrenOf(el)[1]!.addEventListener('activate', () => {
|
|
221
|
+
activated++;
|
|
222
|
+
});
|
|
223
|
+
click(childrenOf(el)[1]!, { detail: 1 });
|
|
224
|
+
expect(activated).toBe(0);
|
|
225
|
+
click(childrenOf(el)[1]!, { detail: 2 });
|
|
226
|
+
expect(activated).toBe(1);
|
|
227
|
+
host.remove();
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
await it('emits selected-children-changed on every change', () => {
|
|
231
|
+
const { el, host } = mount();
|
|
232
|
+
let changes = 0;
|
|
233
|
+
el.addEventListener('selected-children-changed', () => {
|
|
234
|
+
changes++;
|
|
235
|
+
});
|
|
236
|
+
click(childrenOf(el)[0]!);
|
|
237
|
+
click(childrenOf(el)[1]!);
|
|
238
|
+
expect(changes).toBe(2);
|
|
239
|
+
host.remove();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
await it('every cell is its own tab stop, and the arrows walk the line', () => {
|
|
243
|
+
const { el, host } = mount();
|
|
244
|
+
expect(childrenOf(el).every((child) => child.tabIndex === 0)).toBe(true);
|
|
245
|
+
childrenOf(el)[0]!.focus();
|
|
246
|
+
key(childrenOf(el)[0]!, { key: 'ArrowRight' });
|
|
247
|
+
expect(el.selectedChildren).toStrictEqual([1]);
|
|
248
|
+
host.remove();
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
await it('takes a cell appended after connect into the selection', async () => {
|
|
252
|
+
const { el, host } = mount();
|
|
253
|
+
const child = document.createElement('gtk-flow-box-child');
|
|
254
|
+
el.appendChild(child);
|
|
255
|
+
await Promise.resolve();
|
|
256
|
+
expect(el.children).toHaveLength(CELLS + 1);
|
|
257
|
+
host.remove();
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
await describe('<gtk-flow-box-child> on its own', async () => {
|
|
262
|
+
await it('is a gridcell and a tab stop, with its authored child inside', async () => {
|
|
263
|
+
const host = document.createElement('div');
|
|
264
|
+
document.body.appendChild(host);
|
|
265
|
+
const child = document.createElement('gtk-flow-box-child') as GtkFlowBoxChild;
|
|
266
|
+
const text = document.createElement('span');
|
|
267
|
+
text.textContent = 'only';
|
|
268
|
+
child.appendChild(text);
|
|
269
|
+
host.appendChild(child);
|
|
270
|
+
expect(child.getAttribute('role')).toBe('gridcell');
|
|
271
|
+
expect(child.tabIndex).toBe(0);
|
|
272
|
+
expect(child.child).toBe(text);
|
|
273
|
+
expect(child.selected).toBe(false);
|
|
274
|
+
child.classList.add('selected');
|
|
275
|
+
expect(child.selected).toBe(true);
|
|
276
|
+
host.remove();
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
await it('answers its index from the DOM, so a move reports where it IS', async () => {
|
|
280
|
+
const { el, host } = mount();
|
|
281
|
+
const moved = childrenOf(el)[7]!;
|
|
282
|
+
el.prepend(moved);
|
|
283
|
+
await Promise.resolve();
|
|
284
|
+
expect(moved.index).toBe(0);
|
|
285
|
+
expect(el.children[0]).toBe(moved);
|
|
286
|
+
host.remove();
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
};
|