@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,324 @@
|
|
|
1
|
+
// DOM-level tests for `<adw-breakpoint-bin>`, driven by the SAME breakpoint-bin
|
|
2
|
+
// vectors the core suite asserts (`@gjsify/adwaita-core/conformance`).
|
|
3
|
+
//
|
|
4
|
+
// Every row runs against a real element in a real document, resized by a real
|
|
5
|
+
// `ResizeObserver`, and read back off the DOM — not off `BreakpointBinState`, which a
|
|
6
|
+
// renderer could call without ever wiring it to a size. That matters most for these two
|
|
7
|
+
// tables: the pick order (the LAST match wins, not the narrowest) and the restore order
|
|
8
|
+
// (a property both breakpoints set is written ONCE) are the two rules a port gets wrong
|
|
9
|
+
// by reading the source the intuitive way.
|
|
10
|
+
//
|
|
11
|
+
// HOW A VECTOR READS BACK. The tables name objects and properties; here an object is a
|
|
12
|
+
// labelled `<gtk-label id="…">` inside the bin and a property is an ATTRIBUTE on it,
|
|
13
|
+
// which is the form the `breakpoints` attribute writes and therefore the only thing
|
|
14
|
+
// observable. Every original starts ABSENT, so `orig:<object>.<property>` in a table —
|
|
15
|
+
// the value `adw_breakpoint_add_setter` captures — means "the attribute is gone again",
|
|
16
|
+
// which is `removeAttribute` and is half the behaviour under test.
|
|
17
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
18
|
+
|
|
19
|
+
import { BREAKPOINT_PICK_VECTORS, BREAKPOINT_TRANSITION_VECTORS } from '@gjsify/adwaita-core/conformance';
|
|
20
|
+
import type { AdwBreakpointBin } from './elements/adw-breakpoint-bin.js';
|
|
21
|
+
|
|
22
|
+
/** Two frame callbacks — where a `ResizeObserver` delivery lands. */
|
|
23
|
+
function settle(): Promise<void> {
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** One `[object, property]` per pair any setter in `breakpoints` names. */
|
|
30
|
+
function universe(
|
|
31
|
+
breakpoints: readonly (readonly [string, readonly (readonly [string, string, string])[]])[],
|
|
32
|
+
): string[] {
|
|
33
|
+
const keys = new Set<string>();
|
|
34
|
+
for (const [, setters] of breakpoints) for (const [object, property] of setters) keys.add(`${object}.${property}`);
|
|
35
|
+
return [...keys].sort();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** `obj.prop=value`, or `obj.prop=<absent>` when the element does not carry it. */
|
|
39
|
+
function read(objects: ReadonlyMap<string, Element>, keys: readonly string[]): string[] {
|
|
40
|
+
return keys.map((key) => {
|
|
41
|
+
const dot = key.lastIndexOf('.');
|
|
42
|
+
const value = objects.get(key.slice(0, dot))?.getAttribute(key.slice(dot + 1));
|
|
43
|
+
return value === undefined ? key : `${key}=${value ?? '<absent>'}`;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The state a transition is expected to leave, over the whole universe of pairs.
|
|
49
|
+
*
|
|
50
|
+
* Read as a STATE rather than replayed as writes, because that is the only way the skip
|
|
51
|
+
* shows up at all: restoring `title` and then setting it again lands on the same value as
|
|
52
|
+
* setting it once, and only the pair LIST says which happened — every pair the transition
|
|
53
|
+
* did not write is at its original, which is absent here.
|
|
54
|
+
*/
|
|
55
|
+
function spell(row: (typeof BREAKPOINT_TRANSITION_VECTORS)[number], step: number): string[] {
|
|
56
|
+
const written = new Map<string, string>();
|
|
57
|
+
for (const write of row.writes[step] ?? []) {
|
|
58
|
+
const equals = write.indexOf('=');
|
|
59
|
+
const value = write.slice(equals + 1);
|
|
60
|
+
written.set(write.slice(0, equals), value.startsWith('orig:') ? '<absent>' : value);
|
|
61
|
+
}
|
|
62
|
+
return universe(row.breakpoints)
|
|
63
|
+
.map((key) => `${key}=${written.get(key) ?? '<absent>'}`)
|
|
64
|
+
.sort();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Mount one bin filling a host of the given size, with these breakpoints and one child
|
|
69
|
+
* per object.
|
|
70
|
+
*
|
|
71
|
+
* The bin FILLS its host: a GTK widget takes the allocation its parent gives it, and a
|
|
72
|
+
* block-level div only fills the width. Both axes of the pick table are measured, so the
|
|
73
|
+
* stage has to hand over a height as well — which is the C's own advice to set
|
|
74
|
+
* `width-request`/`height-request` on a bin that carries breakpoints.
|
|
75
|
+
*/
|
|
76
|
+
async function mount(
|
|
77
|
+
width: number,
|
|
78
|
+
height: number,
|
|
79
|
+
breakpoints: string,
|
|
80
|
+
objects: readonly string[],
|
|
81
|
+
): Promise<{ bin: AdwBreakpointBin; host: HTMLElement; children: Map<string, Element> }> {
|
|
82
|
+
const host = document.createElement('div');
|
|
83
|
+
host.style.width = `${width}px`;
|
|
84
|
+
host.style.height = `${height}px`;
|
|
85
|
+
document.body.appendChild(host);
|
|
86
|
+
const bin = document.createElement('adw-breakpoint-bin') as AdwBreakpointBin;
|
|
87
|
+
bin.style.height = '100%';
|
|
88
|
+
bin.setAttribute('breakpoints', breakpoints);
|
|
89
|
+
host.appendChild(bin);
|
|
90
|
+
const children = new Map<string, Element>();
|
|
91
|
+
for (const name of objects) {
|
|
92
|
+
const el = document.createElement('gtk-label');
|
|
93
|
+
el.id = name;
|
|
94
|
+
bin.appendChild(el);
|
|
95
|
+
children.set(name, el);
|
|
96
|
+
}
|
|
97
|
+
await settle();
|
|
98
|
+
return { bin, host, children };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** `breaks` as the attribute takes it, with each target a selector on its object. */
|
|
102
|
+
const authored = (
|
|
103
|
+
breakpoints: readonly (readonly [string, readonly (readonly [string, string, string])[]])[],
|
|
104
|
+
): string =>
|
|
105
|
+
JSON.stringify(
|
|
106
|
+
breakpoints.map(([condition, setters]) => ({
|
|
107
|
+
condition,
|
|
108
|
+
setters: setters.map(([target, property, value]) => ({ target: `#${target}`, property, value })),
|
|
109
|
+
})),
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
export const AdwBreakpointBinTest = async () => {
|
|
113
|
+
for (const row of BREAKPOINT_PICK_VECTORS) {
|
|
114
|
+
await it(`picks the right breakpoint — ${row.rule}`, async () => {
|
|
115
|
+
// No setters at all: this table is about WHICH condition wins, and a setter
|
|
116
|
+
// would add a second thing the row could be failing at.
|
|
117
|
+
// One child, because a bin with no child picks nothing at all
|
|
118
|
+
// (`adw_breakpoint_bin_size_allocate` returns before the loop, :427) and this
|
|
119
|
+
// table is about WHICH condition wins.
|
|
120
|
+
const { bin, host } = await mount(
|
|
121
|
+
row.size.width,
|
|
122
|
+
row.size.height,
|
|
123
|
+
JSON.stringify(row.conditions.map((condition) => ({ condition, setters: [] }))),
|
|
124
|
+
['child'],
|
|
125
|
+
);
|
|
126
|
+
await settle();
|
|
127
|
+
const picked = bin.currentBreakpoint;
|
|
128
|
+
host.remove();
|
|
129
|
+
expect(`[${row.conditions.join(' | ')}] @ ${row.size.width}×${row.size.height} → ${picked ?? 'none'}`).toBe(
|
|
130
|
+
`[${row.conditions.join(' | ')}] @ ${row.size.width}×${row.size.height} → ${row.pick ?? 'none'}`,
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
for (const row of BREAKPOINT_TRANSITION_VECTORS) {
|
|
136
|
+
await it(`transitions — ${row.rule}`, async () => {
|
|
137
|
+
const keys = universe(row.breakpoints);
|
|
138
|
+
const names = [...new Set(row.breakpoints.flatMap(([, setters]) => setters.map(([o]) => o)))].sort();
|
|
139
|
+
const { host, children } = await mount(800, 600, authored(row.breakpoints), names);
|
|
140
|
+
let previous = read(children, keys);
|
|
141
|
+
const observed: string[][] = [];
|
|
142
|
+
const wanted: string[][] = [];
|
|
143
|
+
for (const [at, size] of row.sizes.entries()) {
|
|
144
|
+
// A `null` step means NO transition at all, so the state after it is the
|
|
145
|
+
// state before it — which is the assertion, not a copy of what was read.
|
|
146
|
+
if (row.writes[at] === null) wanted.push(previous);
|
|
147
|
+
else wanted.push(spell(row, at));
|
|
148
|
+
host.style.width = `${size.width}px`;
|
|
149
|
+
host.style.height = `${size.height}px`;
|
|
150
|
+
await settle();
|
|
151
|
+
const now = read(children, keys);
|
|
152
|
+
observed.push(now);
|
|
153
|
+
previous = now;
|
|
154
|
+
}
|
|
155
|
+
host.remove();
|
|
156
|
+
for (let at = 0; at < observed.length; at++) {
|
|
157
|
+
expect(`${row.rule} step ${at}: ${JSON.stringify(observed[at])}`).toBe(
|
|
158
|
+
`${row.rule} step ${at}: ${JSON.stringify(wanted[at])}`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
await describe('<adw-breakpoint-bin> the bin itself', async () => {
|
|
165
|
+
await it('has no minimum size while it holds breakpoints, and clips like the C', async () => {
|
|
166
|
+
const { bin, host } = await mount(
|
|
167
|
+
400,
|
|
168
|
+
600,
|
|
169
|
+
JSON.stringify([{ condition: 'max-width: 720px', setters: [] }]),
|
|
170
|
+
[],
|
|
171
|
+
);
|
|
172
|
+
const style = getComputedStyle(bin);
|
|
173
|
+
const report = `min-width:${style.minWidth} overflow:${style.overflow}`;
|
|
174
|
+
host.remove();
|
|
175
|
+
expect(report).toBe('min-width:0px overflow:hidden');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
await it('signals unapply BEFORE the writes and apply AFTER them', async () => {
|
|
179
|
+
// Mounted WIDE and listening before the first write, so the apply is in the
|
|
180
|
+
// log rather than already done.
|
|
181
|
+
const { bin, host, children } = await mount(
|
|
182
|
+
900,
|
|
183
|
+
600,
|
|
184
|
+
JSON.stringify([
|
|
185
|
+
{
|
|
186
|
+
condition: 'max-width: 720px',
|
|
187
|
+
setters: [{ target: '#caption', property: 'label', value: 'Narrow' }],
|
|
188
|
+
},
|
|
189
|
+
]),
|
|
190
|
+
['caption'],
|
|
191
|
+
);
|
|
192
|
+
const caption = children.get('caption') as Element;
|
|
193
|
+
const log: string[] = [];
|
|
194
|
+
bin.addEventListener('breakpoint-unapply', () => log.push(`unapply:${caption.getAttribute('label')}`));
|
|
195
|
+
bin.addEventListener('breakpoint-apply', () => log.push(`apply:${caption.getAttribute('label')}`));
|
|
196
|
+
bin.addEventListener('notify::current-breakpoint', () => log.push(`notify:${bin.currentBreakpoint}`));
|
|
197
|
+
host.style.width = '400px';
|
|
198
|
+
await settle();
|
|
199
|
+
host.style.width = '900px';
|
|
200
|
+
await settle();
|
|
201
|
+
host.remove();
|
|
202
|
+
// A listener on the APPLY end sees the value its own breakpoint wrote and one
|
|
203
|
+
// on the UNAPPLY end still sees the OUTGOING value — the signal precedes the
|
|
204
|
+
// restore, so neither end observes the restore at all.
|
|
205
|
+
expect(log.join(' | ')).toBe('apply:Narrow | notify:0 | unapply:Narrow | notify:null');
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
await it('writes a property both breakpoints set ONCE, not restored and re-set', async () => {
|
|
209
|
+
const { host, children } = await mount(
|
|
210
|
+
500,
|
|
211
|
+
600,
|
|
212
|
+
JSON.stringify([
|
|
213
|
+
{
|
|
214
|
+
condition: 'max-width: 720px',
|
|
215
|
+
setters: [
|
|
216
|
+
{ target: '#view', property: 'title', value: 'narrow' },
|
|
217
|
+
{ target: '#view', property: 'collapsed', value: 'true' },
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
condition: 'max-width: 400px',
|
|
222
|
+
setters: [{ target: '#view', property: 'collapsed', value: 'false' }],
|
|
223
|
+
},
|
|
224
|
+
]),
|
|
225
|
+
['view'],
|
|
226
|
+
);
|
|
227
|
+
const view = children.get('view') as Element;
|
|
228
|
+
// 500 is inside the FIRST breakpoint only, so the second is entered by a
|
|
229
|
+
// resize and the skip is the difference between one mutation per property
|
|
230
|
+
// and two on the one both breakpoints set. Without it the restore would write
|
|
231
|
+
// `collapsed` twice — once removing it, once setting `false` — and the final
|
|
232
|
+
// state would be identical either way, which is why the COUNT is the assertion.
|
|
233
|
+
const mutations = new Map<string, number>();
|
|
234
|
+
new MutationObserver((records) => {
|
|
235
|
+
for (const record of records) {
|
|
236
|
+
mutations.set(record.attributeName, (mutations.get(record.attributeName) ?? 0) + 1);
|
|
237
|
+
}
|
|
238
|
+
}).observe(view, { attributes: true });
|
|
239
|
+
host.style.width = '300px';
|
|
240
|
+
await settle();
|
|
241
|
+
const report = `${[...mutations]
|
|
242
|
+
.sort()
|
|
243
|
+
.map(([k, v]) => `${k}x${v}`)
|
|
244
|
+
.join(' ')} collapsed:${view.getAttribute('collapsed')} title:${view.hasAttribute('title')}`;
|
|
245
|
+
host.remove();
|
|
246
|
+
expect(report).toBe('collapsedx1 titlex1 collapsed:false title:false');
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
await it('keeps tracking its conditions after a re-parent', async () => {
|
|
250
|
+
const first = document.createElement('div');
|
|
251
|
+
first.style.width = '400px';
|
|
252
|
+
first.style.height = '600px';
|
|
253
|
+
document.body.appendChild(first);
|
|
254
|
+
const bin = document.createElement('adw-breakpoint-bin') as AdwBreakpointBin;
|
|
255
|
+
bin.setAttribute(
|
|
256
|
+
'breakpoints',
|
|
257
|
+
JSON.stringify([
|
|
258
|
+
{
|
|
259
|
+
condition: 'max-width: 720px',
|
|
260
|
+
setters: [{ target: '#caption', property: 'label', value: 'Narrow' }],
|
|
261
|
+
},
|
|
262
|
+
]),
|
|
263
|
+
);
|
|
264
|
+
const caption = document.createElement('gtk-label');
|
|
265
|
+
caption.id = 'caption';
|
|
266
|
+
caption.setAttribute('label', 'Wide');
|
|
267
|
+
bin.appendChild(caption);
|
|
268
|
+
first.appendChild(bin);
|
|
269
|
+
await settle();
|
|
270
|
+
|
|
271
|
+
// 800 → 500 → 900 is the cycle `BreakpointBinState.inherit` was added for: a
|
|
272
|
+
// bin rebuilt at "none applied" hears no unapply on the way back to 900px and
|
|
273
|
+
// the caption stays narrow for good.
|
|
274
|
+
const second = document.createElement('div');
|
|
275
|
+
second.style.width = '500px';
|
|
276
|
+
second.style.height = '600px';
|
|
277
|
+
document.body.appendChild(second);
|
|
278
|
+
second.appendChild(bin);
|
|
279
|
+
await settle();
|
|
280
|
+
const narrow = caption.getAttribute('label');
|
|
281
|
+
|
|
282
|
+
second.style.width = '900px';
|
|
283
|
+
await settle();
|
|
284
|
+
const wide = caption.getAttribute('label');
|
|
285
|
+
|
|
286
|
+
first.remove();
|
|
287
|
+
second.remove();
|
|
288
|
+
expect(`500px:${narrow} → 900px:${wide}`).toBe('500px:Narrow → 900px:Wide');
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
await it('picks nothing while it has no child, as `adw_breakpoint_bin_size_allocate` does', async () => {
|
|
292
|
+
const { bin, host } = await mount(
|
|
293
|
+
400,
|
|
294
|
+
600,
|
|
295
|
+
JSON.stringify([
|
|
296
|
+
{
|
|
297
|
+
condition: 'max-width: 720px',
|
|
298
|
+
setters: [{ target: '#caption', property: 'label', value: 'Narrow' }],
|
|
299
|
+
},
|
|
300
|
+
]),
|
|
301
|
+
[],
|
|
302
|
+
);
|
|
303
|
+
const childless = bin.currentBreakpoint;
|
|
304
|
+
bin.appendChild(document.createElement('gtk-label'));
|
|
305
|
+
// A child arriving is not a size change, and the C only re-picks on an
|
|
306
|
+
// allocation — so the next allocation is what this test waits for.
|
|
307
|
+
host.style.width = '401px';
|
|
308
|
+
await settle();
|
|
309
|
+
host.style.width = '400px';
|
|
310
|
+
await settle();
|
|
311
|
+
const withChild = bin.currentBreakpoint;
|
|
312
|
+
host.remove();
|
|
313
|
+
expect(`childless:${childless} with:${withChild}`).toBe('childless:null with:0');
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
await it('applies nothing from an attribute that is not JSON', async () => {
|
|
317
|
+
const { bin, host } = await mount(400, 600, 'not json', []);
|
|
318
|
+
await settle();
|
|
319
|
+
const dropped = bin.currentBreakpoint;
|
|
320
|
+
host.remove();
|
|
321
|
+
expect(`dropped:${dropped}`).toBe('dropped:null');
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// DOM-level tests for <adw-clamp-scrollable>: the SAME clamp arithmetic as
|
|
2
|
+
// `<adw-clamp>` (adw-clamp-layout.c:156-235) but measured along the ORIENTATION the
|
|
3
|
+
// class overrides (adw-clamp-scrollable.c:78-92), and with the scrollport on the
|
|
4
|
+
// element rather than the child — the port's one deviation, and the reason
|
|
5
|
+
// `hscroll-policy`/`vscroll-policy` write `overflow` here
|
|
6
|
+
// (adw-clamp-scrollable.c:440-455).
|
|
7
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
8
|
+
|
|
9
|
+
import type { AdwClampScrollable } from './elements/adw-clamp-scrollable.js';
|
|
10
|
+
|
|
11
|
+
/** Wait for a ResizeObserver delivery (it runs after layout, before paint). */
|
|
12
|
+
function settle(): Promise<void> {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** A scrollport in a fixed host, with one plain block child — the shape every story uses. */
|
|
19
|
+
function mount(
|
|
20
|
+
available: number,
|
|
21
|
+
attributes: Record<string, string> = {},
|
|
22
|
+
): { el: AdwClampScrollable; child: HTMLElement; host: HTMLElement } {
|
|
23
|
+
const host = document.createElement('div');
|
|
24
|
+
host.style.width = `${available}px`;
|
|
25
|
+
host.style.height = `${available}px`;
|
|
26
|
+
document.body.appendChild(host);
|
|
27
|
+
const el = document.createElement('adw-clamp-scrollable') as AdwClampScrollable;
|
|
28
|
+
for (const [name, value] of Object.entries(attributes)) el.setAttribute(name, value);
|
|
29
|
+
const child = document.createElement('div');
|
|
30
|
+
child.textContent = 'clamped';
|
|
31
|
+
el.appendChild(child);
|
|
32
|
+
host.appendChild(el);
|
|
33
|
+
return { el, child, host };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** `clampAllocate`'s three classes, as the element stamps them on the child. */
|
|
37
|
+
function sizeClassOf(child: HTMLElement): string | null {
|
|
38
|
+
for (const cls of ['small', 'medium', 'large']) {
|
|
39
|
+
if (child.classList.contains(cls)) return cls;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const AdwClampScrollableTest = async () => {
|
|
45
|
+
await describe('<adw-clamp-scrollable> cap along the clamped axis', async () => {
|
|
46
|
+
await it('caps the CHILD, never itself', async () => {
|
|
47
|
+
const { el, child, host } = mount(1000);
|
|
48
|
+
await settle();
|
|
49
|
+
expect(child.style.maxWidth).toBe('600px');
|
|
50
|
+
expect(Math.round(child.getBoundingClientRect().width)).toBe(600);
|
|
51
|
+
// The element is the scrollport: a cap on itself would feed its own capped
|
|
52
|
+
// width back into its own ResizeObserver.
|
|
53
|
+
expect(el.style.maxWidth).toBe('');
|
|
54
|
+
expect(el.clientWidth).toBe(1000);
|
|
55
|
+
host.remove();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await it('stamps the size class the clamp layout would', async () => {
|
|
59
|
+
const large = mount(1000);
|
|
60
|
+
await settle();
|
|
61
|
+
expect(sizeClassOf(large.child)).toBe('large');
|
|
62
|
+
large.host.remove();
|
|
63
|
+
|
|
64
|
+
// 700 sits in the easing region between `lower` 400 and `upper`
|
|
65
|
+
// 400 + 3·200, so the cap bites only halfway.
|
|
66
|
+
const medium = mount(700);
|
|
67
|
+
await settle();
|
|
68
|
+
expect(medium.child.style.maxWidth).toBe('575px');
|
|
69
|
+
expect(sizeClassOf(medium.child)).toBe('medium');
|
|
70
|
+
medium.host.remove();
|
|
71
|
+
|
|
72
|
+
const small = mount(300);
|
|
73
|
+
await settle();
|
|
74
|
+
expect(sizeClassOf(small.child)).toBe('small');
|
|
75
|
+
small.host.remove();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
await it('tightens below the cap, easing the transition into it', async () => {
|
|
79
|
+
const { el, child, host } = mount(700);
|
|
80
|
+
el.maximumSize = 600;
|
|
81
|
+
el.tighteningThreshold = 400;
|
|
82
|
+
await settle();
|
|
83
|
+
expect(child.style.maxWidth).toBe('575px');
|
|
84
|
+
host.remove();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
await it('a threshold ABOVE the maximum removes the easing region', async () => {
|
|
88
|
+
const { el, child, host } = mount(700);
|
|
89
|
+
el.maximumSize = 600;
|
|
90
|
+
el.tighteningThreshold = 800;
|
|
91
|
+
await settle();
|
|
92
|
+
expect(child.style.maxWidth).toBe('600px');
|
|
93
|
+
host.remove();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await it('follows `unit`, through the conversion C does per property', async () => {
|
|
97
|
+
const { el, child, host } = mount(1000);
|
|
98
|
+
el.unit = 'pt';
|
|
99
|
+
el.maximumSize = 450;
|
|
100
|
+
await settle();
|
|
101
|
+
// 450pt at 96dpi is the same 600px the default 600sp is.
|
|
102
|
+
expect(child.style.maxWidth).toBe('600px');
|
|
103
|
+
host.remove();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
await it('a VERTICAL clamp caps the height and centres on the block axis', async () => {
|
|
107
|
+
const { el, child, host } = mount(1000, { orientation: 'vertical' });
|
|
108
|
+
el.style.height = '1000px';
|
|
109
|
+
await settle();
|
|
110
|
+
expect(child.style.maxHeight).toBe('600px');
|
|
111
|
+
expect(child.style.maxWidth).toBe('');
|
|
112
|
+
expect(child.style.marginBlock).toBe('auto');
|
|
113
|
+
expect(child.style.marginInline).toBe('');
|
|
114
|
+
host.remove();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
await it('follows the scrollport instead of pinning the child to the cap', async () => {
|
|
118
|
+
const { child, host } = mount(1000);
|
|
119
|
+
await settle();
|
|
120
|
+
host.style.width = '360px';
|
|
121
|
+
await settle();
|
|
122
|
+
expect(child.style.maxWidth).toBe('360px');
|
|
123
|
+
expect(Math.round(child.getBoundingClientRect().width)).toBe(360);
|
|
124
|
+
host.remove();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
await it('caps a child appended after connect', async () => {
|
|
128
|
+
const { el, host } = mount(1000);
|
|
129
|
+
await settle();
|
|
130
|
+
const late = document.createElement('div');
|
|
131
|
+
el.appendChild(late);
|
|
132
|
+
await settle();
|
|
133
|
+
expect(late.style.maxWidth).toBe('600px');
|
|
134
|
+
host.remove();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
await it('reports the GIR defaults before anything is set', () => {
|
|
138
|
+
const { el, host } = mount(1000);
|
|
139
|
+
expect(el.maximumSize).toBe(600);
|
|
140
|
+
expect(el.tighteningThreshold).toBe(400);
|
|
141
|
+
expect(el.unit).toBe('sp');
|
|
142
|
+
expect(el.orientation).toBe('horizontal');
|
|
143
|
+
host.remove();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
await describe('<adw-clamp-scrollable> the policies decide whether it scrolls', async () => {
|
|
148
|
+
await it('defaults to GTK_POLICY_AUTOMATIC on both axes', async () => {
|
|
149
|
+
const { el, host } = mount(400);
|
|
150
|
+
await settle();
|
|
151
|
+
expect(el.style.overflowX).toBe('auto');
|
|
152
|
+
expect(el.style.overflowY).toBe('auto');
|
|
153
|
+
host.remove();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
await it('`never` clamps the axis shut and `always` always shows it', async () => {
|
|
157
|
+
const { el, host } = mount(400, { 'hscroll-policy': 'never', 'vscroll-policy': 'always' });
|
|
158
|
+
await settle();
|
|
159
|
+
expect(el.style.overflowX).toBe('hidden');
|
|
160
|
+
expect(el.style.overflowY).toBe('scroll');
|
|
161
|
+
host.remove();
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
await it('`automatic` scrolls exactly when the content does', async () => {
|
|
165
|
+
// The clamp caps the WIDTH here, so the height is what scrolls.
|
|
166
|
+
const { el, child, host } = mount(400);
|
|
167
|
+
el.style.height = '200px';
|
|
168
|
+
await settle();
|
|
169
|
+
// A child that fits is not scrollable, which is what AUTOMATIC means.
|
|
170
|
+
expect(el.scrollHeight <= el.clientHeight).toBe(true);
|
|
171
|
+
child.style.height = '900px';
|
|
172
|
+
await settle();
|
|
173
|
+
expect(el.scrollHeight).toBeGreaterThan(el.clientHeight);
|
|
174
|
+
host.remove();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
await it('a scrollport with nothing to measure against does not collapse the child', async () => {
|
|
178
|
+
const { el, child, host } = mount(1000, { orientation: 'vertical' });
|
|
179
|
+
el.style.height = '0px';
|
|
180
|
+
await settle();
|
|
181
|
+
// GTK's equivalent is `for_size = -1`: hand the child nothing rather than
|
|
182
|
+
// capping it at 0 and taking the page with it.
|
|
183
|
+
expect(child.style.maxHeight).toBe('');
|
|
184
|
+
expect(child.style.maxWidth).toBe('');
|
|
185
|
+
expect(sizeClassOf(child)).toBeNull();
|
|
186
|
+
host.remove();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
};
|