@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,281 @@
|
|
|
1
|
+
// DOM-level tests for <adw-view-switcher-sidebar>: the sidebar-shaped switcher that
|
|
2
|
+
// drives an <adw-view-stack>. What is C here is the GROUPING (`populate_sidebar`), the
|
|
3
|
+
// index for activation (`activated_cb`), the indicator's three states (`update_badge`)
|
|
4
|
+
// and the direction of the selection (`selection_changed_cb`) — so those are what the
|
|
5
|
+
// rows below pin, on top of the shared section vectors.
|
|
6
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
7
|
+
|
|
8
|
+
import { VIEW_SWITCHER_SIDEBAR_SECTION_VECTORS } from '@gjsify/adwaita-core/conformance';
|
|
9
|
+
import { createViewSwitcherPage, viewSwitcherSidebarSections } from '@gjsify/adwaita-core';
|
|
10
|
+
|
|
11
|
+
import type { AdwViewSwitcherSidebar } from './elements/adw-view-switcher-sidebar.js';
|
|
12
|
+
import type { AdwViewStack } from './elements/adw-view-stack.js';
|
|
13
|
+
|
|
14
|
+
interface PageSpec {
|
|
15
|
+
name: string;
|
|
16
|
+
title?: string;
|
|
17
|
+
icon?: string;
|
|
18
|
+
startsSection?: string;
|
|
19
|
+
badge?: string;
|
|
20
|
+
attention?: boolean;
|
|
21
|
+
hidden?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function mount(
|
|
25
|
+
pages: PageSpec[],
|
|
26
|
+
attrs = '',
|
|
27
|
+
): {
|
|
28
|
+
sidebar: AdwViewSwitcherSidebar;
|
|
29
|
+
stack: AdwViewStack;
|
|
30
|
+
host: HTMLElement;
|
|
31
|
+
} {
|
|
32
|
+
const host = document.createElement('div');
|
|
33
|
+
const inner = pages
|
|
34
|
+
.map(
|
|
35
|
+
(page) =>
|
|
36
|
+
`<adw-view-stack-page name="${page.name}"${page.title ? ` title="${page.title}"` : ''}` +
|
|
37
|
+
`${page.icon ? ` icon-name="${page.icon}"` : ''}${page.startsSection ? ` starts-section` : ''}` +
|
|
38
|
+
`${page.startsSection && page.startsSection !== 'true' ? ` section-title="${page.startsSection}"` : ''}` +
|
|
39
|
+
`${page.badge ? ` badge-number="${page.badge}"` : ''}${page.attention ? ' needs-attention' : ''}` +
|
|
40
|
+
`${page.hidden ? ' hidden' : ''}></adw-view-stack-page>`,
|
|
41
|
+
)
|
|
42
|
+
.join('');
|
|
43
|
+
// A plain row, NOT an <adw-navigation-split-view>: libadwaita refuses anything but an
|
|
44
|
+
// `Adw.NavigationPage` in either pane (`g_return_if_fail (ADW_IS_NAVIGATION_PAGE …)`,
|
|
45
|
+
// adw-navigation-split-view.c), so the split view would drop both of these rather
|
|
46
|
+
// than showing them side by side.
|
|
47
|
+
host.innerHTML =
|
|
48
|
+
`<div class="stage" style="display:flex">` +
|
|
49
|
+
`<adw-view-switcher-sidebar ${attrs}></adw-view-switcher-sidebar>` +
|
|
50
|
+
`<adw-view-stack>${inner}</adw-view-stack>` +
|
|
51
|
+
`</div>`;
|
|
52
|
+
document.body.appendChild(host);
|
|
53
|
+
return {
|
|
54
|
+
sidebar: host.querySelector('adw-view-switcher-sidebar') as AdwViewSwitcherSidebar,
|
|
55
|
+
stack: host.querySelector('adw-view-stack') as AdwViewStack,
|
|
56
|
+
host,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const rows = (sidebar: AdwViewSwitcherSidebar): HTMLElement[] =>
|
|
61
|
+
Array.from(sidebar.querySelectorAll('adw-sidebar > .adw-sidebar-list .adw-sidebar-item'));
|
|
62
|
+
const headings = (sidebar: AdwViewSwitcherSidebar): string[] =>
|
|
63
|
+
Array.from(sidebar.querySelectorAll('adw-sidebar .adw-sidebar-section-heading')).map((el) => el.textContent ?? '');
|
|
64
|
+
const indicator = (sidebar: AdwViewSwitcherSidebar, row: number): HTMLElement =>
|
|
65
|
+
rows(sidebar)[row].querySelector('.indicator') as HTMLElement;
|
|
66
|
+
|
|
67
|
+
export const AdwViewSwitcherSidebarTest = async () => {
|
|
68
|
+
await describe('viewSwitcherSidebarSections (populate_sidebar)', async () => {
|
|
69
|
+
await it('drives the same grouping the conformance table pins', async () => {
|
|
70
|
+
for (const vector of VIEW_SWITCHER_SIDEBAR_SECTION_VECTORS) {
|
|
71
|
+
const names = vector.pages === '' ? [] : vector.pages.split(',');
|
|
72
|
+
const starts = vector.starts === '' ? [] : vector.starts.split(',');
|
|
73
|
+
const pages = names.map((name) =>
|
|
74
|
+
createViewSwitcherPage({
|
|
75
|
+
name,
|
|
76
|
+
startsSection: starts.includes(name),
|
|
77
|
+
sectionTitle: vector.sections.split(',')[starts.indexOf(name)] ?? null,
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
80
|
+
const sections = viewSwitcherSidebarSections(pages);
|
|
81
|
+
expect(sections.map((section) => section.pages.map((page) => page.name).join(','))).toStrictEqual(
|
|
82
|
+
vector.groups === '' ? [] : vector.groups.split('/'),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
await describe('<adw-view-switcher-sidebar> sections', async () => {
|
|
89
|
+
await it('gives every stack page a row, in stack order', async () => {
|
|
90
|
+
const { sidebar, host } = mount([
|
|
91
|
+
{ name: 'inbox', title: 'Inbox', icon: 'mail-unread' },
|
|
92
|
+
{ name: 'drafts', title: 'Drafts' },
|
|
93
|
+
]);
|
|
94
|
+
expect(rows(sidebar)).toHaveLength(2);
|
|
95
|
+
expect(rows(sidebar)[0].querySelector('.adw-sidebar-item-title')?.textContent).toBe('Inbox');
|
|
96
|
+
expect(rows(sidebar)[1].querySelector('.adw-sidebar-item-title')?.textContent).toBe('Drafts');
|
|
97
|
+
expect((rows(sidebar)[0].querySelector('.adw-sidebar-item-icon') as HTMLElement).hidden).toBe(false);
|
|
98
|
+
host.remove();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
await it('splits the pages at starts-section, headed by section-title', async () => {
|
|
102
|
+
const { sidebar, host } = mount([
|
|
103
|
+
{ name: 'inbox', title: 'Inbox' },
|
|
104
|
+
{ name: 'drafts', title: 'Drafts' },
|
|
105
|
+
{ name: 'archive', title: 'Archive', startsSection: 'Archive' },
|
|
106
|
+
]);
|
|
107
|
+
expect(rows(sidebar)).toHaveLength(3);
|
|
108
|
+
expect(headings(sidebar)).toStrictEqual(['Archive']);
|
|
109
|
+
// ONE header, and it is the titled one: the leading untitled section draws
|
|
110
|
+
// NOTHING, because `create_header` binds that stack's `visible` to
|
|
111
|
+
// `string_is_not_empty (title)` (adw-sidebar.c:1461-1467) — the header C builds
|
|
112
|
+
// there is invisible, so there is no separator to count either.
|
|
113
|
+
expect(sidebar.querySelectorAll('adw-sidebar .adw-sidebar-section-header')).toHaveLength(1);
|
|
114
|
+
host.remove();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
await it('draws a separator, not a second heading, for an untitled section after the first', async () => {
|
|
118
|
+
// The untitled section opens on `archive` and holds `spam` with it, so the
|
|
119
|
+
// separator C binds (`get_header_stack_page` → "separator", :1425-1434) is the
|
|
120
|
+
// only header between the two.
|
|
121
|
+
const { sidebar, host } = mount([
|
|
122
|
+
{ name: 'inbox', title: 'Inbox' },
|
|
123
|
+
{ name: 'archive', title: 'Archive', startsSection: 'true' },
|
|
124
|
+
{ name: 'spam', title: 'Spam' },
|
|
125
|
+
]);
|
|
126
|
+
expect(rows(sidebar)).toHaveLength(3);
|
|
127
|
+
// The leading section is untitled too — `section-title` is the only thing that
|
|
128
|
+
// titles a section, and `inbox` declares none — so `Archive`'s section is the
|
|
129
|
+
// separator's and there is no heading at all.
|
|
130
|
+
expect(headings(sidebar)).toStrictEqual([]);
|
|
131
|
+
expect(sidebar.querySelectorAll('adw-sidebar .adw-sidebar-section-header.separator')).toHaveLength(1);
|
|
132
|
+
host.remove();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
await it('keeps a hidden page as a row, because C binds visible rather than dropping it', async () => {
|
|
136
|
+
const { sidebar, host } = mount([
|
|
137
|
+
{ name: 'inbox', title: 'Inbox' },
|
|
138
|
+
{ name: 'drafts', title: 'Drafts', hidden: true },
|
|
139
|
+
]);
|
|
140
|
+
expect(rows(sidebar)).toHaveLength(2);
|
|
141
|
+
expect(rows(sidebar)[1].hidden).toBe(true);
|
|
142
|
+
host.remove();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
await describe('<adw-view-switcher-sidebar> selection and activation', async () => {
|
|
147
|
+
await it('marks the row of the stack’s visible page, and follows a later change', async () => {
|
|
148
|
+
const { sidebar, stack, host } = mount([
|
|
149
|
+
{ name: 'inbox', title: 'Inbox' },
|
|
150
|
+
{ name: 'drafts', title: 'Drafts' },
|
|
151
|
+
]);
|
|
152
|
+
expect(rows(sidebar)[0].classList.contains('selected')).toBe(true);
|
|
153
|
+
stack.visibleChildName = 'drafts';
|
|
154
|
+
expect(rows(sidebar)[1].classList.contains('selected')).toBe(true);
|
|
155
|
+
expect(rows(sidebar)[0].classList.contains('selected')).toBe(false);
|
|
156
|
+
host.remove();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
await it('activates the page at the same index, and only then emits activated', async () => {
|
|
160
|
+
const { sidebar, stack, host } = mount([
|
|
161
|
+
{ name: 'inbox', title: 'Inbox' },
|
|
162
|
+
{ name: 'drafts', title: 'Drafts' },
|
|
163
|
+
{ name: 'sent', title: 'Sent' },
|
|
164
|
+
]);
|
|
165
|
+
const seen: { index: number; visible: string }[] = [];
|
|
166
|
+
sidebar.addEventListener('activated', (event) => {
|
|
167
|
+
seen.push({
|
|
168
|
+
index: (event as CustomEvent).detail.index,
|
|
169
|
+
// The stack has ALREADY moved — that is the C order (:104-112).
|
|
170
|
+
visible: stack.visibleChildName,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
rows(sidebar)[0].click();
|
|
174
|
+
const afterFirst = seen.length;
|
|
175
|
+
rows(sidebar)[2].click();
|
|
176
|
+
// ONE event per click, and `seen` is BOTH of them: the first row was the
|
|
177
|
+
// visible page already, and C activates a selected row like any other.
|
|
178
|
+
expect({ afterFirst, name: stack.visibleChildName, seen }).toStrictEqual({
|
|
179
|
+
afterFirst: 1,
|
|
180
|
+
name: 'sent',
|
|
181
|
+
seen: [
|
|
182
|
+
{ index: 0, visible: 'inbox' },
|
|
183
|
+
{ index: 2, visible: 'sent' },
|
|
184
|
+
],
|
|
185
|
+
});
|
|
186
|
+
host.remove();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
await describe('<adw-view-switcher-sidebar> indicator (update_badge)', async () => {
|
|
191
|
+
await it('draws no bin at all for a page with neither dot nor count', async () => {
|
|
192
|
+
const { sidebar, host } = mount([{ name: 'inbox', title: 'Inbox' }]);
|
|
193
|
+
expect(indicator(sidebar, 0).hidden).toBe(true);
|
|
194
|
+
host.remove();
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
await it('draws a bare dot for needs-attention with no count', async () => {
|
|
198
|
+
const { sidebar, host } = mount([{ name: 'inbox', title: 'Inbox', attention: true }]);
|
|
199
|
+
const bin = indicator(sidebar, 0);
|
|
200
|
+
expect(bin.hidden).toBe(false);
|
|
201
|
+
expect(bin.classList.contains('dot')).toBe(true);
|
|
202
|
+
expect(bin.classList.contains('needs-attention')).toBe(true);
|
|
203
|
+
expect(bin.querySelector('.numeric')).toBeNull();
|
|
204
|
+
host.remove();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
await it('replaces the dot with the count, and caps it above 999', async () => {
|
|
208
|
+
const { sidebar, host } = mount([
|
|
209
|
+
{ name: 'a', title: 'A', badge: '3' },
|
|
210
|
+
{ name: 'b', title: 'B', badge: '999' },
|
|
211
|
+
{ name: 'c', title: 'C', badge: '1000', attention: true },
|
|
212
|
+
]);
|
|
213
|
+
expect(indicator(sidebar, 0).classList.contains('dot')).toBe(false);
|
|
214
|
+
expect(indicator(sidebar, 0).querySelector('.numeric')?.textContent).toBe('3');
|
|
215
|
+
// `> 999`, so 999 itself prints.
|
|
216
|
+
expect(indicator(sidebar, 1).querySelector('.numeric')?.textContent).toBe('999');
|
|
217
|
+
expect(indicator(sidebar, 2).querySelector('.numeric')?.textContent).toBe('999+');
|
|
218
|
+
expect(indicator(sidebar, 2).classList.contains('needs-attention')).toBe(true);
|
|
219
|
+
host.remove();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
await describe('<adw-view-switcher-sidebar> mode, filter and placeholder', async () => {
|
|
224
|
+
await it('switches the sidebar between sidebar and page mode', async () => {
|
|
225
|
+
const { sidebar, host } = mount([{ name: 'inbox', title: 'Inbox' }]);
|
|
226
|
+
const inner = sidebar.querySelector('adw-sidebar') as HTMLElement;
|
|
227
|
+
expect(inner.classList.contains('page')).toBe(false);
|
|
228
|
+
sidebar.setAttribute('mode', 'page');
|
|
229
|
+
expect(sidebar.mode).toBe('page');
|
|
230
|
+
expect(inner.classList.contains('page')).toBe(true);
|
|
231
|
+
host.remove();
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
await it('shows the placeholder when the filter takes every row, and hides it again', async () => {
|
|
235
|
+
const { sidebar, host } = mount([
|
|
236
|
+
{ name: 'inbox', title: 'Inbox' },
|
|
237
|
+
{ name: 'drafts', title: 'Drafts' },
|
|
238
|
+
]);
|
|
239
|
+
const placeholder = sidebar.querySelector('.view-switcher-sidebar-placeholder') as HTMLElement;
|
|
240
|
+
expect(placeholder.hidden).toBe(true);
|
|
241
|
+
|
|
242
|
+
const status = document.createElement('adw-status-page');
|
|
243
|
+
status.setAttribute('icon', 'system-search');
|
|
244
|
+
status.setAttribute('title', 'Nothing Found');
|
|
245
|
+
sidebar.placeholder = status;
|
|
246
|
+
// EVERY row, which is the condition `update_placeholder` binds the placeholder
|
|
247
|
+
// to — a filter that leaves one row standing leaves the placeholder hidden, so
|
|
248
|
+
// `() => false` is the only predicate this test's name describes.
|
|
249
|
+
sidebar.filter = () => false;
|
|
250
|
+
expect(placeholder.hidden).toBe(false);
|
|
251
|
+
expect(placeholder.contains(status)).toBe(true);
|
|
252
|
+
|
|
253
|
+
sidebar.filter = null;
|
|
254
|
+
expect(placeholder.hidden).toBe(true);
|
|
255
|
+
host.remove();
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
await it('accepts a stack by id, the way the property takes the element', async () => {
|
|
259
|
+
const host = document.createElement('div');
|
|
260
|
+
host.innerHTML =
|
|
261
|
+
`<adw-view-stack id="pages"><adw-view-stack-page name="a" title="A"></adw-view-stack-page></adw-view-stack>` +
|
|
262
|
+
`<adw-view-switcher-sidebar stack="pages"></adw-view-switcher-sidebar>`;
|
|
263
|
+
document.body.appendChild(host);
|
|
264
|
+
const sidebar = host.querySelector('adw-view-switcher-sidebar') as AdwViewSwitcherSidebar;
|
|
265
|
+
expect(sidebar.stack).toBe(host.querySelector('adw-view-stack'));
|
|
266
|
+
expect(rows(sidebar)).toHaveLength(1);
|
|
267
|
+
host.remove();
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
await it('keeps prefix and suffix out of the item list', async () => {
|
|
271
|
+
const host = document.createElement('div');
|
|
272
|
+
host.innerHTML = `<adw-view-switcher-sidebar><span slot="prefix">Top</span><span slot="suffix">Bottom</span></adw-view-switcher-sidebar>`;
|
|
273
|
+
document.body.appendChild(host);
|
|
274
|
+
const sidebar = host.querySelector('adw-view-switcher-sidebar') as AdwViewSwitcherSidebar;
|
|
275
|
+
expect(sidebar.prefixWidget?.textContent).toBe('Top');
|
|
276
|
+
expect(sidebar.suffixWidget?.textContent).toBe('Bottom');
|
|
277
|
+
expect(rows(sidebar)).toHaveLength(0);
|
|
278
|
+
host.remove();
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// DOM-level behaviour tests for <adw-window>. Runs in a real browser via the
|
|
2
|
+
// @gjsify/adwaita-web browser test axis (tests/browser Playwright harness). The
|
|
3
|
+
// custom elements are registered by importing the package root in test.browser.mts;
|
|
4
|
+
// these specs create elements via document.createElement and assert their DOM
|
|
5
|
+
// behaviour (content area, breakpoints, dialog tracking).
|
|
6
|
+
import { describe, it, expect } from '@gjsify/unit';
|
|
7
|
+
|
|
8
|
+
import type { AdwWindow } from './elements/adw-window.js';
|
|
9
|
+
|
|
10
|
+
function makeWindow(html = '<p>Content</p>'): AdwWindow {
|
|
11
|
+
const el = document.createElement('adw-window') as AdwWindow;
|
|
12
|
+
el.innerHTML = html;
|
|
13
|
+
document.body.appendChild(el);
|
|
14
|
+
return el;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Wait for a ResizeObserver delivery (it runs after layout, before paint). */
|
|
18
|
+
function settle(): Promise<void> {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const AdwWindowTest = async () => {
|
|
25
|
+
await describe('adw-window content', async () => {
|
|
26
|
+
await it('places children in the content area', async () => {
|
|
27
|
+
const win = makeWindow('<p id="hello">Hello</p>');
|
|
28
|
+
const content = win.querySelector('.adw-window-content');
|
|
29
|
+
expect(content?.querySelector('#hello')?.textContent).toBe('Hello');
|
|
30
|
+
win.remove();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
await it('content property returns the first child of the content area', async () => {
|
|
34
|
+
const win = makeWindow('<p id="first">First</p><p id="second">Second</p>');
|
|
35
|
+
expect(win.content?.id).toBe('first');
|
|
36
|
+
win.remove();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await it('content setter moves an element into the content area', async () => {
|
|
40
|
+
const win = makeWindow();
|
|
41
|
+
const p = document.createElement('p');
|
|
42
|
+
p.id = 'moved';
|
|
43
|
+
win.content = p;
|
|
44
|
+
expect(win.querySelector('.adw-window-content')?.querySelector('#moved')).toBe(p);
|
|
45
|
+
win.remove();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await it('applies the default 360×200 size', async () => {
|
|
49
|
+
const win = makeWindow();
|
|
50
|
+
expect(win.style.width).toBe('360px');
|
|
51
|
+
expect(win.style.height).toBe('200px');
|
|
52
|
+
win.remove();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
await it('width/height attributes override the default size', async () => {
|
|
56
|
+
const win = document.createElement('adw-window') as AdwWindow;
|
|
57
|
+
win.setAttribute('width', '500');
|
|
58
|
+
win.setAttribute('height', '400');
|
|
59
|
+
document.body.appendChild(win);
|
|
60
|
+
expect(win.style.width).toBe('500px');
|
|
61
|
+
expect(win.style.height).toBe('400px');
|
|
62
|
+
win.remove();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await describe('adw-window breakpoints', async () => {
|
|
67
|
+
await it('addBreakpoint() returns a breakpoint and tracks it', async () => {
|
|
68
|
+
const win = makeWindow();
|
|
69
|
+
const bp = win.addBreakpoint('max-width: 500px');
|
|
70
|
+
expect(win.breakpoints.length).toBe(1);
|
|
71
|
+
expect(win.breakpoints[0]).toBe(bp);
|
|
72
|
+
win.remove();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await it('currentBreakpoint is null when no breakpoint is applied', async () => {
|
|
76
|
+
const win = makeWindow();
|
|
77
|
+
win.addBreakpoint('max-width: 100px');
|
|
78
|
+
// The window is wider than 100px in the test viewport.
|
|
79
|
+
expect(win.currentBreakpoint).toBeNull();
|
|
80
|
+
win.remove();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// A window is what a client-side route change re-parents, and `disconnectedCallback`
|
|
84
|
+
// releases the observer — so the bind has to come back on the next connect.
|
|
85
|
+
await it('re-binds the breakpoints after the window is re-attached', async () => {
|
|
86
|
+
const win = makeWindow();
|
|
87
|
+
win.addBreakpoint('max-width: 300px');
|
|
88
|
+
await settle();
|
|
89
|
+
expect(win.dataset.breakpoint).toBeUndefined();
|
|
90
|
+
|
|
91
|
+
win.remove();
|
|
92
|
+
document.body.appendChild(win);
|
|
93
|
+
win.setAttribute('width', '200');
|
|
94
|
+
await settle();
|
|
95
|
+
|
|
96
|
+
expect(win.dataset.breakpoint).toBe('max-width: 300px');
|
|
97
|
+
expect(win.currentBreakpoint).toBe(win.breakpoints[0]!);
|
|
98
|
+
win.remove();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
await describe('adw-window dialog tracking', async () => {
|
|
103
|
+
await it('tracks open dialogs presented inside the window', async () => {
|
|
104
|
+
const win = makeWindow();
|
|
105
|
+
const dialog = document.createElement('adw-dialog') as HTMLElement & { present(): void };
|
|
106
|
+
dialog.innerHTML = '<p>Dialog content</p>';
|
|
107
|
+
win.appendChild(dialog);
|
|
108
|
+
dialog.present();
|
|
109
|
+
expect(win.dialogs.length).toBe(1);
|
|
110
|
+
expect(win.visibleDialog).toBe(dialog);
|
|
111
|
+
dialog.remove();
|
|
112
|
+
win.remove();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
await it('stops tracking a dialog when it closes', async () => {
|
|
116
|
+
const win = makeWindow();
|
|
117
|
+
const dialog = document.createElement('adw-dialog') as HTMLElement & { present(): void; close(): void };
|
|
118
|
+
dialog.innerHTML = '<p>Dialog content</p>';
|
|
119
|
+
win.appendChild(dialog);
|
|
120
|
+
dialog.present();
|
|
121
|
+
expect(win.dialogs.length).toBe(1);
|
|
122
|
+
dialog.close();
|
|
123
|
+
expect(win.dialogs.length).toBe(0);
|
|
124
|
+
expect(win.visibleDialog).toBeNull();
|
|
125
|
+
dialog.remove();
|
|
126
|
+
win.remove();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
};
|
package/src/breakpoints.ts
CHANGED
|
@@ -16,31 +16,48 @@
|
|
|
16
16
|
// Copyright (c) GNOME contributors (libadwaita). LGPLv2.1+.
|
|
17
17
|
|
|
18
18
|
import { AdwBreakpoint } from '@gjsify/adwaita-core';
|
|
19
|
+
import type { BreakpointSize } from '@gjsify/adwaita-core';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
|
-
*
|
|
22
|
+
* The SIZE SOURCE both adaptive shapes in this package share: a `ResizeObserver` on
|
|
23
|
+
* `element`, handing every delivery's BORDER box to `onSize`.
|
|
22
24
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
+
* Split out of {@link addBreakpoints} because a second consumer needs the box without
|
|
26
|
+
* the `AdwBreakpoint` state machine: `<adw-breakpoint-bin>` drives `BreakpointBinState`
|
|
27
|
+
* (core), which evaluates a LIST of breakpoints and answers with the writes to perform,
|
|
28
|
+
* so it cannot be handed one `AdwBreakpoint` per condition. Two readers of
|
|
29
|
+
* `borderBoxSize` would be two shapes of the fallback, and the fallback is the half that
|
|
30
|
+
* only matters on the engines that do not report `borderBoxSize` at all.
|
|
31
|
+
*
|
|
32
|
+
* `ResizeObserver` delivers an initial observation on `observe()`, so the caller
|
|
33
|
+
* settles on the correct state before first paint — no flash of the wrong layout, no
|
|
25
34
|
* separate seeding pass. The size read is the BORDER box in CSS pixels, the browser's
|
|
26
35
|
* counterpart to the `sp`/DIP units an Adwaita condition is written in.
|
|
27
36
|
*/
|
|
28
|
-
export function
|
|
37
|
+
export function observeAdaptiveSize(element: Element, onSize: (size: BreakpointSize) => void): () => void {
|
|
29
38
|
const observer = new ResizeObserver((entries) => {
|
|
30
39
|
const entry = entries[entries.length - 1];
|
|
31
40
|
if (!entry) return;
|
|
32
41
|
// borderBoxSize is the spec'd path; contentRect is the fallback for the shape older
|
|
33
42
|
// engines report.
|
|
34
43
|
const box = entry.borderBoxSize?.[0];
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
onSize(
|
|
45
|
+
box
|
|
46
|
+
? { width: box.inlineSize, height: box.blockSize }
|
|
47
|
+
: { width: entry.contentRect.width, height: entry.contentRect.height },
|
|
48
|
+
);
|
|
39
49
|
});
|
|
40
50
|
observer.observe(element);
|
|
41
51
|
return () => observer.disconnect();
|
|
42
52
|
}
|
|
43
53
|
|
|
54
|
+
/** Drive `breakpoints` from `element`'s own box, and return a dispose function. */
|
|
55
|
+
export function addBreakpoints(element: Element, breakpoints: readonly AdwBreakpoint[]): () => void {
|
|
56
|
+
return observeAdaptiveSize(element, (size) => {
|
|
57
|
+
for (const breakpoint of breakpoints) breakpoint.evaluate(size);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
44
61
|
/**
|
|
45
62
|
* Wire a `breakpoint="<condition>"` attribute to a boolean setter, the browser equivalent
|
|
46
63
|
* of an `Adw.Breakpoint` with one `add_setter()` call. Returns a dispose function; call it
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Which template constructs `adwaita-web`'s tree builder builds (ADR 0093 § 2). Pure data, so a
|
|
2
|
+
// build plugin can read it without importing the renderer — and plain `.mjs`, because the
|
|
3
|
+
// plugin loads it under Node from a published package, where Node refuses to strip types.
|
|
4
|
+
|
|
5
|
+
/** @type {import('./capabilities.d.mts').capabilities} */
|
|
6
|
+
export const capabilities = {
|
|
7
|
+
layout: {
|
|
8
|
+
refused:
|
|
9
|
+
'an <adw-…> element is placed by DOM order and slot=, so a layout-manager placement has no door in the markup this package reads (ADR 0092)',
|
|
10
|
+
},
|
|
11
|
+
strings: 'implemented',
|
|
12
|
+
responses: 'implemented',
|
|
13
|
+
page: 'implemented',
|
|
14
|
+
extern: 'implemented',
|
|
15
|
+
signal: 'implemented',
|
|
16
|
+
bind: 'implemented',
|
|
17
|
+
breakpoint: 'implemented',
|
|
18
|
+
};
|
|
@@ -38,6 +38,10 @@ import { exportedElementClasses } from './exported-elements.js';
|
|
|
38
38
|
*/
|
|
39
39
|
const NON_RENDERING = new Set([
|
|
40
40
|
'input',
|
|
41
|
+
// Not a void element, but the same shape for this driver: a `<textarea>` renders its own
|
|
42
|
+
// `value` and lays out no children, so a probe appended into one measures 0 forever.
|
|
43
|
+
// `<gtk-text-view>.textarea` is the handle, the way `<gtk-entry>.input` is.
|
|
44
|
+
'textarea',
|
|
41
45
|
'img',
|
|
42
46
|
'br',
|
|
43
47
|
'hr',
|
|
@@ -72,6 +76,14 @@ function reveal(el: HTMLElement): void {
|
|
|
72
76
|
if (typeof dialog.present === 'function') dialog.present();
|
|
73
77
|
// `<adw-expander-row>.contentSection` is merely COLLAPSED — it is the disclosure.
|
|
74
78
|
if (el.localName === 'adw-expander-row') el.setAttribute('expanded', '');
|
|
79
|
+
// `<adw-application-window>.menubar` is merely EMPTY: GTK draws no menubar for an
|
|
80
|
+
// application that installed none, so the strip stays hidden until BOTH the flag and
|
|
81
|
+
// a model are there. Keyed by tag for the same reason the expander is — the pair is
|
|
82
|
+
// its own idea, and no other widget in this package has it.
|
|
83
|
+
if (el.localName === 'adw-application-window') {
|
|
84
|
+
el.setAttribute('show-menubar', '');
|
|
85
|
+
el.setAttribute('menu-model', '[{"label":"File","submenu":[{"label":"Quit"}]}]');
|
|
86
|
+
}
|
|
75
87
|
}
|
|
76
88
|
|
|
77
89
|
/**
|