@gjsify/adwaita-web 0.64.1 → 0.64.2-next.254
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -88
- package/dist/adwaita-web.css +91 -12
- package/dist/adwaita-web.css.map +1 -1
- package/lib/types/accessible.d.ts +8 -0
- package/lib/types/application.d.ts +1 -1
- package/lib/types/child-slot.spec.d.ts +1 -0
- package/lib/types/compute-expand.d.ts +5 -0
- package/lib/types/compute-expand.spec.d.ts +1 -0
- package/lib/types/container-fill.spec.d.ts +1 -0
- package/lib/types/elements/adw-about-dialog.d.ts +28 -1
- package/lib/types/elements/adw-action-row.d.ts +2 -1
- package/lib/types/elements/adw-alert-dialog.d.ts +80 -19
- package/lib/types/elements/adw-avatar.d.ts +2 -1
- package/lib/types/elements/adw-banner.d.ts +2 -1
- package/lib/types/elements/adw-bin.d.ts +2 -1
- package/lib/types/elements/adw-bottom-sheet.d.ts +5 -4
- package/lib/types/elements/adw-breakpoint-bin.d.ts +2 -1
- package/lib/types/elements/adw-button-content.d.ts +2 -1
- package/lib/types/elements/adw-button-row.d.ts +2 -1
- package/lib/types/elements/adw-card.d.ts +2 -1
- package/lib/types/elements/adw-carousel.d.ts +20 -3
- package/lib/types/elements/adw-clamp-scrollable.d.ts +2 -1
- package/lib/types/elements/adw-clamp.d.ts +2 -1
- package/lib/types/elements/adw-combo-row.d.ts +6 -1
- package/lib/types/elements/adw-data-grid.d.ts +2 -1
- package/lib/types/elements/adw-dialog.d.ts +2 -1
- package/lib/types/elements/adw-entry-row.d.ts +2 -1
- package/lib/types/elements/adw-expander-row.d.ts +2 -1
- package/lib/types/elements/adw-header-bar.d.ts +2 -1
- package/lib/types/elements/adw-inline-view-switcher.d.ts +3 -2
- package/lib/types/elements/adw-layout-slot.d.ts +2 -1
- package/lib/types/elements/adw-multi-layout-view.d.ts +2 -1
- package/lib/types/elements/adw-navigation-split-view.d.ts +2 -1
- package/lib/types/elements/adw-navigation-view.d.ts +3 -2
- package/lib/types/elements/adw-overlay-split-view.d.ts +2 -1
- package/lib/types/elements/adw-preferences-dialog.d.ts +5 -4
- package/lib/types/elements/adw-preferences-group.d.ts +2 -1
- package/lib/types/elements/adw-preferences-row.d.ts +2 -1
- package/lib/types/elements/adw-shortcut-label.d.ts +2 -1
- package/lib/types/elements/adw-shortcuts-item.d.ts +2 -1
- package/lib/types/elements/adw-shortcuts-section.d.ts +2 -1
- package/lib/types/elements/adw-sidebar.d.ts +4 -3
- package/lib/types/elements/adw-spin-row.d.ts +2 -1
- package/lib/types/elements/adw-spinner.d.ts +2 -1
- package/lib/types/elements/adw-split-button.d.ts +2 -1
- package/lib/types/elements/adw-status-page.d.ts +2 -1
- package/lib/types/elements/adw-switch-row.d.ts +4 -1
- package/lib/types/elements/adw-tab-bar.d.ts +2 -1
- package/lib/types/elements/adw-tab-button.d.ts +2 -1
- package/lib/types/elements/adw-tab-overview.d.ts +2 -1
- package/lib/types/elements/adw-tab-view.d.ts +3 -2
- package/lib/types/elements/adw-toast-overlay.d.ts +10 -30
- package/lib/types/elements/adw-toggle-group.d.ts +3 -2
- package/lib/types/elements/adw-toolbar-view.d.ts +2 -1
- package/lib/types/elements/adw-view-stack.d.ts +3 -1
- package/lib/types/elements/adw-view-switcher-bar.d.ts +2 -1
- package/lib/types/elements/adw-view-switcher-sidebar.d.ts +2 -1
- package/lib/types/elements/adw-view-switcher.d.ts +3 -2
- package/lib/types/elements/adw-window-features.d.ts +8 -0
- package/lib/types/elements/adw-window-title.d.ts +2 -1
- package/lib/types/elements/adw-wrap-box.d.ts +2 -1
- package/lib/types/elements/checks.d.ts +16 -1
- package/lib/types/elements/gtk-action-bar.d.ts +2 -1
- package/lib/types/elements/gtk-application-window.d.ts +1 -4
- package/lib/types/elements/gtk-aspect-frame.d.ts +2 -1
- package/lib/types/elements/gtk-box.d.ts +5 -1
- package/lib/types/elements/gtk-button.d.ts +5 -7
- package/lib/types/elements/gtk-calendar.d.ts +2 -1
- package/lib/types/elements/gtk-center-box.d.ts +2 -1
- package/lib/types/elements/gtk-color-dialog-button.d.ts +2 -1
- package/lib/types/elements/gtk-drag-icon.d.ts +2 -1
- package/lib/types/elements/gtk-drawing-area.d.ts +2 -1
- package/lib/types/elements/gtk-drop-down.d.ts +2 -1
- package/lib/types/elements/gtk-editable-label.d.ts +2 -1
- package/lib/types/elements/gtk-emoji-chooser.d.ts +2 -0
- package/lib/types/elements/gtk-entry.d.ts +2 -1
- package/lib/types/elements/gtk-expander.d.ts +2 -1
- package/lib/types/elements/gtk-fixed.d.ts +2 -1
- package/lib/types/elements/gtk-flow-box-child.d.ts +2 -1
- package/lib/types/elements/gtk-flow-box.d.ts +2 -1
- package/lib/types/elements/gtk-font-dialog-button.d.ts +2 -1
- package/lib/types/elements/gtk-frame.d.ts +2 -1
- package/lib/types/elements/gtk-gl-area.d.ts +2 -1
- package/lib/types/elements/gtk-graphics-offload.d.ts +2 -1
- package/lib/types/elements/gtk-grid.d.ts +2 -1
- package/lib/types/elements/gtk-header-bar.d.ts +2 -1
- package/lib/types/elements/gtk-image.d.ts +5 -6
- package/lib/types/elements/gtk-inscription.d.ts +2 -1
- package/lib/types/elements/gtk-label.d.ts +10 -3
- package/lib/types/elements/gtk-level-bar.d.ts +2 -1
- package/lib/types/elements/gtk-list-box-row.d.ts +2 -1
- package/lib/types/elements/gtk-list-box.d.ts +2 -1
- package/lib/types/elements/gtk-list-view.d.ts +2 -1
- package/lib/types/elements/gtk-media-controls.d.ts +2 -1
- package/lib/types/elements/gtk-menu-button.d.ts +2 -1
- package/lib/types/elements/gtk-notebook.d.ts +2 -1
- package/lib/types/elements/gtk-overlay.d.ts +2 -1
- package/lib/types/elements/gtk-paned.d.ts +2 -1
- package/lib/types/elements/gtk-picture.d.ts +2 -1
- package/lib/types/elements/gtk-popover-bin.d.ts +2 -1
- package/lib/types/elements/gtk-popover-menu-bar.d.ts +2 -1
- package/lib/types/elements/gtk-popover-menu.d.ts +2 -0
- package/lib/types/elements/gtk-popover.d.ts +7 -1
- package/lib/types/elements/gtk-progress-bar.d.ts +2 -1
- package/lib/types/elements/gtk-revealer.d.ts +2 -1
- package/lib/types/elements/gtk-scale-button.d.ts +2 -1
- package/lib/types/elements/gtk-scale.d.ts +2 -1
- package/lib/types/elements/gtk-scrollbar.d.ts +2 -1
- package/lib/types/elements/gtk-scrolled-window.d.ts +2 -1
- package/lib/types/elements/gtk-search-bar.d.ts +2 -1
- package/lib/types/elements/gtk-separator.d.ts +2 -1
- package/lib/types/elements/gtk-spin-button.d.ts +2 -1
- package/lib/types/elements/gtk-spinner.d.ts +2 -1
- package/lib/types/elements/gtk-stack-page.d.ts +29 -0
- package/lib/types/elements/gtk-stack-sidebar.d.ts +2 -1
- package/lib/types/elements/gtk-stack-switcher.d.ts +2 -1
- package/lib/types/elements/gtk-stack.d.ts +13 -1
- package/lib/types/elements/gtk-switch.d.ts +2 -1
- package/lib/types/elements/gtk-text-view.d.ts +2 -1
- package/lib/types/elements/gtk-text.d.ts +2 -1
- package/lib/types/elements/gtk-tree-expander.d.ts +2 -1
- package/lib/types/elements/gtk-video.d.ts +2 -1
- package/lib/types/elements/gtk-viewport.d.ts +2 -1
- package/lib/types/elements/gtk-window-controls.d.ts +2 -1
- package/lib/types/elements/gtk-window-handle.d.ts +2 -1
- package/lib/types/elements/gtk-window.d.ts +18 -2
- package/lib/types/gobject-elements.d.ts +15 -0
- package/lib/types/gtksource/gtk-source-view.d.ts +2 -1
- package/lib/types/{icon-registry.spec.d.ts → icon-masks.spec.d.ts} +1 -1
- package/lib/types/icon-theme.d.ts +15 -35
- package/lib/types/index.d.ts +3 -4
- package/lib/types/learn6502-window.spec.d.ts +1 -0
- package/lib/types/namespace/adw.d.ts +1 -1
- package/lib/types/namespace/gdk.d.ts +1 -0
- package/lib/types/namespace/gio.d.ts +1 -0
- package/lib/types/namespace/glib.d.ts +2 -1
- package/lib/types/namespace/gtk.d.ts +2 -0
- package/lib/types/shared-tree-builder.d.ts +31 -0
- package/lib/types/signals.d.ts +5 -1
- package/lib/types/source-view/adw-source-view.d.ts +2 -1
- package/lib/types/styles.generated.d.ts +1 -1
- package/lib/types/widget-element.d.ts +25 -0
- package/lib/types/widget-map.spec.d.ts +1 -0
- package/lib/types/widget-mapping.d.ts +7 -0
- package/lib/types/widget-visible.spec.d.ts +1 -0
- package/lib/types/window-maximize.spec.d.ts +1 -0
- package/package.json +13 -12
- package/scss/_about_dialog.scss +46 -1
- package/scss/_bin.scss +6 -3
- package/scss/_checks.scss +5 -2
- package/scss/_icon.scss +3 -4
- package/scss/_labels.scss +2 -2
- package/scss/_overlay.scss +11 -1
- package/scss/_overlay_split_view.scss +10 -0
- package/scss/_reset.scss +1 -1
- package/scss/_scrolled_window.scss +15 -0
- package/scss/_stack.scss +8 -2
- package/scss/_toast.scss +13 -3
- package/scss/_widget.scss +5 -1
- package/scss/_window.scss +16 -0
- package/src/accessible.ts +29 -0
- package/src/adw-about-dialog.spec.ts +81 -12
- package/src/adw-action-rows.spec.ts +2 -2
- package/src/adw-alert-dialog.spec.ts +71 -5
- package/src/adw-bin.spec.ts +4 -3
- package/src/adw-button-content.spec.ts +1 -1
- package/src/adw-carousel.spec.ts +49 -1
- package/src/adw-header-bar.spec.ts +18 -0
- package/src/adw-toast-overlay.spec.ts +68 -24
- package/src/application.spec.ts +44 -0
- package/src/application.ts +13 -18
- package/src/capabilities.mjs +2 -3
- package/src/checks.spec.ts +51 -1
- package/src/child-slot.spec.ts +71 -0
- package/src/compute-expand.spec.ts +186 -0
- package/src/compute-expand.ts +134 -0
- package/src/construct-vectors.spec.ts +97 -7
- package/src/container-fill.spec.ts +70 -0
- package/src/elements/adw-about-dialog.ts +152 -9
- package/src/elements/adw-action-row.ts +2 -1
- package/src/elements/adw-alert-dialog.ts +177 -46
- package/src/elements/adw-application-window.ts +0 -3
- package/src/elements/adw-avatar.ts +2 -1
- package/src/elements/adw-banner.ts +2 -1
- package/src/elements/adw-bin.ts +2 -1
- package/src/elements/adw-bottom-sheet.ts +5 -4
- package/src/elements/adw-breakpoint-bin.ts +5 -1
- package/src/elements/adw-button-content.ts +2 -1
- package/src/elements/adw-button-row.ts +2 -1
- package/src/elements/adw-card.ts +2 -1
- package/src/elements/adw-carousel.ts +62 -3
- package/src/elements/adw-clamp-scrollable.ts +2 -1
- package/src/elements/adw-clamp.ts +2 -1
- package/src/elements/adw-combo-row.ts +15 -1
- package/src/elements/adw-data-grid.ts +2 -1
- package/src/elements/adw-dialog.ts +5 -2
- package/src/elements/adw-entry-row.ts +2 -1
- package/src/elements/adw-expander-row.ts +2 -1
- package/src/elements/adw-header-bar.ts +6 -1
- package/src/elements/adw-inline-view-switcher.ts +3 -2
- package/src/elements/adw-layout-slot.ts +2 -1
- package/src/elements/adw-multi-layout-view.ts +2 -1
- package/src/elements/adw-navigation-split-view.ts +2 -1
- package/src/elements/adw-navigation-view.ts +3 -2
- package/src/elements/adw-overlay-split-view.ts +2 -1
- package/src/elements/adw-preferences-dialog.ts +6 -4
- package/src/elements/adw-preferences-group.ts +2 -1
- package/src/elements/adw-preferences-row.ts +2 -1
- package/src/elements/adw-shortcut-label.ts +2 -1
- package/src/elements/adw-shortcuts-item.ts +2 -1
- package/src/elements/adw-shortcuts-section.ts +2 -1
- package/src/elements/adw-sidebar.ts +4 -3
- package/src/elements/adw-spin-row.ts +2 -1
- package/src/elements/adw-spinner.ts +2 -1
- package/src/elements/adw-split-button.ts +2 -1
- package/src/elements/adw-status-page.ts +2 -1
- package/src/elements/adw-switch-row.ts +10 -1
- package/src/elements/adw-tab-bar.ts +2 -1
- package/src/elements/adw-tab-button.ts +2 -1
- package/src/elements/adw-tab-overview.ts +2 -1
- package/src/elements/adw-tab-view.ts +3 -2
- package/src/elements/adw-toast-overlay.ts +37 -70
- package/src/elements/adw-toggle-group.ts +3 -2
- package/src/elements/adw-toolbar-view.ts +2 -1
- package/src/elements/adw-view-stack.ts +39 -1
- package/src/elements/adw-view-switcher-bar.ts +2 -1
- package/src/elements/adw-view-switcher-sidebar.ts +2 -1
- package/src/elements/adw-view-switcher.ts +3 -2
- package/src/elements/adw-window-features.ts +14 -2
- package/src/elements/adw-window-title.ts +2 -1
- package/src/elements/adw-wrap-box.ts +2 -1
- package/src/elements/checks.ts +85 -6
- package/src/elements/gtk-action-bar.ts +2 -1
- package/src/elements/gtk-application-window.ts +3 -8
- package/src/elements/gtk-aspect-frame.ts +2 -1
- package/src/elements/gtk-box.ts +56 -1
- package/src/elements/gtk-button.ts +10 -22
- package/src/elements/gtk-calendar.ts +2 -1
- package/src/elements/gtk-center-box.ts +2 -1
- package/src/elements/gtk-color-dialog-button.ts +2 -1
- package/src/elements/gtk-drag-icon.ts +6 -1
- package/src/elements/gtk-drawing-area.ts +2 -1
- package/src/elements/gtk-drop-down.ts +2 -1
- package/src/elements/gtk-editable-label.ts +2 -1
- package/src/elements/gtk-emoji-chooser.ts +5 -0
- package/src/elements/gtk-entry.ts +2 -1
- package/src/elements/gtk-expander.ts +2 -1
- package/src/elements/gtk-fixed.ts +2 -1
- package/src/elements/gtk-flow-box-child.ts +5 -2
- package/src/elements/gtk-flow-box.ts +2 -1
- package/src/elements/gtk-font-dialog-button.ts +2 -1
- package/src/elements/gtk-frame.ts +2 -1
- package/src/elements/gtk-gl-area.ts +2 -1
- package/src/elements/gtk-graphics-offload.ts +5 -2
- package/src/elements/gtk-grid.ts +2 -1
- package/src/elements/gtk-header-bar.ts +2 -1
- package/src/elements/gtk-image.ts +14 -15
- package/src/elements/gtk-inscription.ts +2 -1
- package/src/elements/gtk-label.ts +12 -5
- package/src/elements/gtk-level-bar.ts +2 -1
- package/src/elements/gtk-list-box-row.ts +5 -2
- package/src/elements/gtk-list-box.ts +2 -1
- package/src/elements/gtk-list-view.ts +2 -1
- package/src/elements/gtk-media-controls.ts +2 -1
- package/src/elements/gtk-menu-button.ts +2 -1
- package/src/elements/gtk-notebook.ts +2 -1
- package/src/elements/gtk-overlay.ts +7 -5
- package/src/elements/gtk-paned.ts +9 -2
- package/src/elements/gtk-picture.ts +2 -1
- package/src/elements/gtk-popover-bin.ts +5 -1
- package/src/elements/gtk-popover-menu-bar.ts +2 -1
- package/src/elements/gtk-popover-menu.ts +5 -0
- package/src/elements/gtk-popover.ts +14 -1
- package/src/elements/gtk-progress-bar.ts +2 -1
- package/src/elements/gtk-revealer.ts +2 -1
- package/src/elements/gtk-scale-button.ts +2 -1
- package/src/elements/gtk-scale.ts +2 -1
- package/src/elements/gtk-scrollbar.ts +2 -1
- package/src/elements/gtk-scrolled-window.ts +8 -5
- package/src/elements/gtk-search-bar.ts +7 -6
- package/src/elements/gtk-separator.ts +2 -1
- package/src/elements/gtk-spin-button.ts +2 -1
- package/src/elements/gtk-spinner.ts +2 -1
- package/src/elements/gtk-stack-page.ts +112 -0
- package/src/elements/gtk-stack-sidebar.ts +2 -1
- package/src/elements/gtk-stack-switcher.ts +2 -1
- package/src/elements/gtk-stack.ts +52 -6
- package/src/elements/gtk-switch.ts +2 -1
- package/src/elements/gtk-text-view.ts +2 -1
- package/src/elements/gtk-text.ts +2 -1
- package/src/elements/gtk-tree-expander.ts +5 -1
- package/src/elements/gtk-video.ts +2 -1
- package/src/elements/gtk-viewport.ts +6 -1
- package/src/elements/gtk-window-controls.ts +2 -1
- package/src/elements/gtk-window-handle.ts +6 -1
- package/src/elements/gtk-window.ts +57 -7
- package/src/gio.spec.ts +13 -3
- package/src/glib.spec.ts +9 -0
- package/src/gobject-elements.ts +44 -2
- package/src/gtk-label.spec.ts +39 -0
- package/src/gtk-scrolled-window.spec.ts +6 -6
- package/src/gtk-stack.spec.ts +170 -0
- package/src/gtk-value-doors.spec.ts +19 -0
- package/src/gtk-window.spec.ts +2 -2
- package/src/gtksource/gtk-source-view.ts +2 -1
- package/src/{icon-registry.spec.ts → icon-masks.spec.ts} +4 -100
- package/src/icon-theme.spec.ts +69 -124
- package/src/icon-theme.ts +29 -119
- package/src/index.ts +5 -9
- package/src/keyboard-operable.spec.ts +3 -3
- package/src/learn6502-window.spec.ts +113 -0
- package/src/namespace/adw.ts +1 -1
- package/src/namespace/gdk.ts +1 -0
- package/src/namespace/gio.ts +8 -0
- package/src/namespace/glib.ts +4 -0
- package/src/namespace/gtk.ts +2 -0
- package/src/shared-tree-builder.ts +131 -13
- package/src/shared-trees.spec.ts +15 -1
- package/src/signals.ts +11 -2
- package/src/slotted-children.spec.ts +24 -0
- package/src/slotted-children.ts +18 -2
- package/src/source-view/adw-source-view.ts +2 -1
- package/src/split-button.spec.ts +1 -1
- package/src/style-manager.spec.ts +13 -0
- package/src/style-manager.ts +6 -0
- package/src/styles.generated.ts +1 -1
- package/src/test.browser.mts +16 -2
- package/src/value-lists.spec.ts +3 -3
- package/src/widget-element.ts +75 -0
- package/src/widget-map.spec.ts +116 -0
- package/src/widget-mapping.ts +100 -0
- package/src/widget-visible.spec.ts +148 -0
- package/src/window-maximize.spec.ts +93 -0
- package/lib/types/icon-registry.d.ts +0 -37
- package/src/icon-registry.ts +0 -163
package/src/test.browser.mts
CHANGED
|
@@ -28,6 +28,7 @@ import { AdwMultiLayoutViewTest } from './adw-multi-layout-view.spec.js';
|
|
|
28
28
|
import { AdwDataGridTest } from './adw-data-grid.spec.js';
|
|
29
29
|
import { GtkSourceViewTest } from './gtksource/gtk-source-view.spec.js';
|
|
30
30
|
import { AdwDialogTest } from './adw-dialog.spec.js';
|
|
31
|
+
import { WidgetMapTest } from './widget-map.spec.js';
|
|
31
32
|
import { AdwWindowTest } from './adw-window.spec.js';
|
|
32
33
|
import { AdwShortcutsTest } from './adw-shortcuts.spec.js';
|
|
33
34
|
import { AdwApplicationWindowTest } from './adw-application-window.spec.js';
|
|
@@ -65,7 +66,7 @@ import { PangoMarkupTest } from './pango-markup.spec.js';
|
|
|
65
66
|
import { CopyGlyphTest } from './source-view/copy-glyph.spec.js';
|
|
66
67
|
import { AdwButtonContentTest } from './adw-button-content.spec.js';
|
|
67
68
|
import { GtkImageTest } from './gtk-image.spec.js';
|
|
68
|
-
import {
|
|
69
|
+
import { AdwIconMasksTest } from './icon-masks.spec.js';
|
|
69
70
|
import { AdwIconThemeTest } from './icon-theme.spec.js';
|
|
70
71
|
import { GioResourceTest } from './gio-resource.spec.js';
|
|
71
72
|
import { GtkSwitchTest } from './gtk-switch.spec.js';
|
|
@@ -83,6 +84,7 @@ import { GtkListViewTest } from './gtk-list-view.spec.js';
|
|
|
83
84
|
import { GtkHeaderBarTest } from './gtk-header-bar.spec.js';
|
|
84
85
|
import { GtkWindowControlsTest } from './gtk-window-controls.spec.js';
|
|
85
86
|
import { GtkWindowTest } from './gtk-window.spec.js';
|
|
87
|
+
import { WindowMaximizeTest } from './window-maximize.spec.js';
|
|
86
88
|
import { GtkApplicationWindowTest } from './gtk-application-window.spec.js';
|
|
87
89
|
import { GtkActionBarTest } from './gtk-action-bar.spec.js';
|
|
88
90
|
import { GtkSeparatorTest } from './gtk-separator.spec.js';
|
|
@@ -93,6 +95,8 @@ import { GtkTreeExpanderTest } from './gtk-tree-expander.spec.js';
|
|
|
93
95
|
import { GtkToggleButtonTest } from './gtk-toggle-button.spec.js';
|
|
94
96
|
import { GtkExpanderTest } from './gtk-expander.spec.js';
|
|
95
97
|
import { GtkOverlayTest } from './gtk-overlay.spec.js';
|
|
98
|
+
import { ContainerFillTest } from './container-fill.spec.js';
|
|
99
|
+
import { ComputeExpandTest } from './compute-expand.spec.js';
|
|
96
100
|
import { GtkPanedTest } from './gtk-paned.spec.js';
|
|
97
101
|
import { GtkRevealerTest } from './gtk-revealer.spec.js';
|
|
98
102
|
import { GtkScaleTest } from './gtk-scale.spec.js';
|
|
@@ -161,6 +165,9 @@ import { AdwValueListsTest } from './value-lists.spec.js';
|
|
|
161
165
|
import { AdwBlueprintLayoutTest } from './blueprint-layout.spec.js';
|
|
162
166
|
import { AdwWidgetSizeTest } from './widget-size.spec.js';
|
|
163
167
|
import { AdwSharedTreeMountTest } from './shared-tree-mount.spec.js';
|
|
168
|
+
import { AdwWidgetVisibleTest } from './widget-visible.spec.js';
|
|
169
|
+
import { AdwChildSlotTest } from './child-slot.spec.js';
|
|
170
|
+
import { AdwLearn6502WindowTest } from './learn6502-window.spec.js';
|
|
164
171
|
import { AdwBlueprintMarkupTest } from './blueprint-markup.spec.js';
|
|
165
172
|
import { AdwTagsTest } from './tags.spec.js';
|
|
166
173
|
import { AdwFontStackTest } from './font-stack.spec.js';
|
|
@@ -183,6 +190,9 @@ run({
|
|
|
183
190
|
AdwBlueprintLayoutTest,
|
|
184
191
|
AdwWidgetSizeTest,
|
|
185
192
|
AdwSharedTreeMountTest,
|
|
193
|
+
AdwWidgetVisibleTest,
|
|
194
|
+
AdwChildSlotTest,
|
|
195
|
+
AdwLearn6502WindowTest,
|
|
186
196
|
AdwBlueprintMarkupTest,
|
|
187
197
|
AdwTagsTest,
|
|
188
198
|
AdwKeyboardOperableTest,
|
|
@@ -201,7 +211,7 @@ run({
|
|
|
201
211
|
CopyGlyphTest,
|
|
202
212
|
AdwButtonContentTest,
|
|
203
213
|
GtkImageTest,
|
|
204
|
-
|
|
214
|
+
AdwIconMasksTest,
|
|
205
215
|
AdwIconThemeTest,
|
|
206
216
|
GioResourceTest,
|
|
207
217
|
GtkSwitchTest,
|
|
@@ -219,6 +229,7 @@ run({
|
|
|
219
229
|
GtkHeaderBarTest,
|
|
220
230
|
GtkWindowControlsTest,
|
|
221
231
|
GtkWindowTest,
|
|
232
|
+
WindowMaximizeTest,
|
|
222
233
|
GtkApplicationWindowTest,
|
|
223
234
|
GtkActionBarTest,
|
|
224
235
|
GtkSeparatorTest,
|
|
@@ -234,6 +245,8 @@ run({
|
|
|
234
245
|
GtkToggleButtonTest,
|
|
235
246
|
GtkExpanderTest,
|
|
236
247
|
GtkOverlayTest,
|
|
248
|
+
ContainerFillTest,
|
|
249
|
+
ComputeExpandTest,
|
|
237
250
|
GtkPanedTest,
|
|
238
251
|
GtkRevealerTest,
|
|
239
252
|
GtkScaleTest,
|
|
@@ -287,6 +300,7 @@ run({
|
|
|
287
300
|
AdwDataGridTest,
|
|
288
301
|
GtkSourceViewTest,
|
|
289
302
|
AdwDialogTest,
|
|
303
|
+
WidgetMapTest,
|
|
290
304
|
AdwWindowTest,
|
|
291
305
|
AdwShortcutsTest,
|
|
292
306
|
AdwApplicationWindowTest,
|
package/src/value-lists.spec.ts
CHANGED
|
@@ -63,9 +63,9 @@ export const AdwValueListsTest = async () => {
|
|
|
63
63
|
const dialog = root as unknown as AdwAlertDialog;
|
|
64
64
|
const read = vector.responses.map(({ id }) => ({
|
|
65
65
|
id,
|
|
66
|
-
label: dialog.
|
|
67
|
-
appearance: dialog.
|
|
68
|
-
enabled: dialog.
|
|
66
|
+
label: dialog.get_response_label(id),
|
|
67
|
+
appearance: dialog.get_response_appearance(id),
|
|
68
|
+
enabled: dialog.get_response_enabled(id),
|
|
69
69
|
}));
|
|
70
70
|
expect(JSON.stringify(read)).toBe(JSON.stringify(vector.responses));
|
|
71
71
|
// The buttons the dialog paints, in the order the source wrote them.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// `Gtk.Widget`'s `visible` and `tooltip-text` on the element classes, once, so the types of every
|
|
2
|
+
// widget carry them and so does a plain `document.createElement()`, not only a built tree.
|
|
3
|
+
//
|
|
4
|
+
// `WidgetElement` is `HTMLElement` plus `gtk_widget_get_visible` / `gtk_widget_set_visible` over
|
|
5
|
+
// the DOM's `hidden` attribute, TRUE until hidden as GtkWidget's default is, and the `map` /
|
|
6
|
+
// `unmap` signals with `gtk_widget_get_mapped` (`widget-mapping.ts`); `installVisible`
|
|
7
|
+
// (`gobject-elements.ts`) gives the same to a class that does not extend it. It notifies only
|
|
8
|
+
// where the element declares `notify::visible`. A subclass with its own `visible`
|
|
9
|
+
// (`<gtk-stack-page>`, `<adw-sidebar>`) keeps its own.
|
|
10
|
+
//
|
|
11
|
+
// `TooltipElement` adds `Gtk.Widget:tooltip-text` for the elements that render the
|
|
12
|
+
// `tooltip-text` attribute: a button, and the rows (`row-tooltip.ts`). It reflects that attribute
|
|
13
|
+
// and the element's `attributeChangedCallback` draws it, so a widget that does not draw it does
|
|
14
|
+
// not extend this class.
|
|
15
|
+
//
|
|
16
|
+
// Reference: GTK gtk/gtkwidget.c (gtk_widget_set_visible, gtk_widget_set_tooltip_text)
|
|
17
|
+
// Copyright (c) GNOME contributors (GTK). LGPLv2.1+.
|
|
18
|
+
|
|
19
|
+
import { WIDGET_VISIBLE_GETTERS, notifyElement } from './gobject-elements.js';
|
|
20
|
+
import { dispatchedSignalsOf, type DispatchedSignals } from './signals.js';
|
|
21
|
+
import { isMapped } from './widget-mapping.js';
|
|
22
|
+
|
|
23
|
+
export class WidgetElement extends HTMLElement {
|
|
24
|
+
/** `Gtk.Widget::map` / `::unmap`, which every subclass inherits (`dispatchedSignalsOf`). */
|
|
25
|
+
static readonly signals: DispatchedSignals = { map: 'map', unmap: 'unmap' };
|
|
26
|
+
|
|
27
|
+
/** `Gtk.Widget:visible`. */
|
|
28
|
+
get visible(): boolean {
|
|
29
|
+
return !this.hidden;
|
|
30
|
+
}
|
|
31
|
+
set visible(value: boolean) {
|
|
32
|
+
const before = !this.hidden;
|
|
33
|
+
this.toggleAttribute('hidden', !value);
|
|
34
|
+
if (!this.hidden !== before && 'notify::visible' in dispatchedSignalsOf(this)) notifyElement(this, 'visible');
|
|
35
|
+
}
|
|
36
|
+
/** `gtk_widget_get_visible`. */
|
|
37
|
+
get_visible(): boolean {
|
|
38
|
+
return this.visible;
|
|
39
|
+
}
|
|
40
|
+
/** `gtk_widget_set_visible`. */
|
|
41
|
+
set_visible(visible: boolean): void {
|
|
42
|
+
this.visible = visible;
|
|
43
|
+
}
|
|
44
|
+
/** `gtk_widget_get_mapped`: on screen, which is in the document and rendered. */
|
|
45
|
+
get_mapped(): boolean {
|
|
46
|
+
return isMapped(this);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
WIDGET_VISIBLE_GETTERS.add(Object.getOwnPropertyDescriptor(WidgetElement.prototype, 'visible')!.get!);
|
|
51
|
+
|
|
52
|
+
export class TooltipElement extends WidgetElement {
|
|
53
|
+
/** `Gtk.Widget:tooltip-text`, the `tooltip-text` attribute; `null` while unset. */
|
|
54
|
+
get tooltip_text(): string | null {
|
|
55
|
+
return this.getAttribute('tooltip-text');
|
|
56
|
+
}
|
|
57
|
+
set tooltip_text(value: string | null) {
|
|
58
|
+
if (value === null || value === undefined) this.removeAttribute('tooltip-text');
|
|
59
|
+
else this.setAttribute('tooltip-text', value);
|
|
60
|
+
}
|
|
61
|
+
get tooltipText(): string | null {
|
|
62
|
+
return this.tooltip_text;
|
|
63
|
+
}
|
|
64
|
+
set tooltipText(value: string | null) {
|
|
65
|
+
this.tooltip_text = value;
|
|
66
|
+
}
|
|
67
|
+
/** `gtk_widget_get_tooltip_text`. */
|
|
68
|
+
get_tooltip_text(): string | null {
|
|
69
|
+
return this.tooltip_text;
|
|
70
|
+
}
|
|
71
|
+
/** `gtk_widget_set_tooltip_text`. */
|
|
72
|
+
set_tooltip_text(text: string | null): void {
|
|
73
|
+
this.tooltip_text = text;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// `Gtk.Widget::map` / `::unmap` and `get_mapped()` on an element: WIDGET_MAP_VECTORS, plus the
|
|
2
|
+
// program that found the gap — a registered `Adw.PreferencesDialog` subclass connecting `map` in
|
|
3
|
+
// its constructor (Learn6502's preferences dialog), which threw "declares no signal 'map'".
|
|
4
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
5
|
+
import { driveWidgetMapVectors, WIDGET_MAP_VECTORS, type WidgetMapSubject } from '@gjsify/adwaita-core/conformance';
|
|
6
|
+
|
|
7
|
+
import { Adw, GObject } from './index.js';
|
|
8
|
+
import { installElementApi } from './gobject-elements.js';
|
|
9
|
+
import type { WidgetElement } from './widget-element.js';
|
|
10
|
+
|
|
11
|
+
type Connectable = HTMLElement & { connect(signal: string, handler: (...args: unknown[]) => unknown): number };
|
|
12
|
+
|
|
13
|
+
function settle(): Promise<void> {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const hosts: HTMLElement[] = [];
|
|
18
|
+
|
|
19
|
+
const subject: WidgetMapSubject = {
|
|
20
|
+
name: 'adwaita-web',
|
|
21
|
+
isOracle: false,
|
|
22
|
+
box() {
|
|
23
|
+
const el = document.createElement('gtk-box');
|
|
24
|
+
installElementApi(el);
|
|
25
|
+
return el;
|
|
26
|
+
},
|
|
27
|
+
append: (parent, child) => void (parent as HTMLElement).append(child as HTMLElement),
|
|
28
|
+
remove: (_parent, child) => void (child as HTMLElement).remove(),
|
|
29
|
+
present(widget) {
|
|
30
|
+
const host = document.createElement('div');
|
|
31
|
+
host.append(widget as HTMLElement);
|
|
32
|
+
document.body.append(host);
|
|
33
|
+
hosts.push(host);
|
|
34
|
+
},
|
|
35
|
+
setVisible: (widget, visible) => void ((widget as WidgetElement).visible = visible),
|
|
36
|
+
connect: (widget, signal, handler) => (widget as Connectable).connect(signal, handler),
|
|
37
|
+
isMapped: (widget) => (widget as WidgetElement).get_mapped(),
|
|
38
|
+
settle,
|
|
39
|
+
dispose() {
|
|
40
|
+
for (const host of hosts.splice(0)) host.remove();
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
class GoWebMapDialog extends Adw.PreferencesDialog {
|
|
45
|
+
log: string[] = [];
|
|
46
|
+
constructor(params?: Record<string, unknown>) {
|
|
47
|
+
// @ts-expect-error the element's own constructor takes none; the registered class's takes the params
|
|
48
|
+
super(params);
|
|
49
|
+
const self = this as unknown as Connectable & { get_mapped(): boolean };
|
|
50
|
+
self.connect('map', () => this.log.push(`map:${self.get_mapped()}`));
|
|
51
|
+
self.connect('unmap', () => this.log.push(`unmap:${self.get_mapped()}`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
GObject.registerClass({ GTypeName: 'GoWebMapDialog' }, GoWebMapDialog);
|
|
55
|
+
|
|
56
|
+
export const WidgetMapTest = async () => {
|
|
57
|
+
await driveWidgetMapVectors(subject, { describe, it, expect }, WIDGET_MAP_VECTORS);
|
|
58
|
+
|
|
59
|
+
await describe('adwaita-web: map / unmap on an element', async () => {
|
|
60
|
+
await it('every widget declares both, a subclass with its own signals too', () => {
|
|
61
|
+
for (const tag of ['gtk-box', 'gtk-button', 'adw-preferences-dialog']) {
|
|
62
|
+
const el = document.createElement(tag);
|
|
63
|
+
installElementApi(el);
|
|
64
|
+
expect(() => (el as Connectable).connect('map', () => {})).not.toThrow();
|
|
65
|
+
expect(() => (el as Connectable).connect('unmap', () => {})).not.toThrow();
|
|
66
|
+
}
|
|
67
|
+
// `<gtk-button>` declares `clicked` itself and still has `map`.
|
|
68
|
+
const button = document.createElement('gtk-button');
|
|
69
|
+
installElementApi(button);
|
|
70
|
+
expect(() => (button as Connectable).connect('clicked', () => {})).not.toThrow();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await it('a registered dialog connecting `map` in its constructor maps on present() and unmaps on close()', async () => {
|
|
74
|
+
const dialog = new (GoWebMapDialog as unknown as new () => GoWebMapDialog)();
|
|
75
|
+
await settle();
|
|
76
|
+
expect(dialog.log).toStrictEqual([]);
|
|
77
|
+
(dialog as unknown as { present(): void }).present();
|
|
78
|
+
await settle();
|
|
79
|
+
expect(dialog.log).toStrictEqual(['map:true']);
|
|
80
|
+
(dialog as unknown as { close(): void }).close();
|
|
81
|
+
await settle();
|
|
82
|
+
expect(dialog.log).toStrictEqual(['map:true', 'unmap:false']);
|
|
83
|
+
dialog.remove();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
await it('a disconnected handler stops the watch: no emission after it', async () => {
|
|
87
|
+
const box = subject.box() as Connectable & { disconnect(id: number): void };
|
|
88
|
+
let emitted = 0;
|
|
89
|
+
const id = box.connect('map', () => void emitted++);
|
|
90
|
+
box.disconnect(id);
|
|
91
|
+
subject.present(box);
|
|
92
|
+
await settle();
|
|
93
|
+
expect(emitted).toBe(0);
|
|
94
|
+
subject.dispose();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
await it('a popover that opens maps, one that closes unmaps', async () => {
|
|
98
|
+
const host = document.createElement('div');
|
|
99
|
+
const popover = document.createElement('div');
|
|
100
|
+
popover.setAttribute('popover', '');
|
|
101
|
+
const inner = subject.box() as Connectable;
|
|
102
|
+
popover.append(inner);
|
|
103
|
+
host.append(popover);
|
|
104
|
+
document.body.append(host);
|
|
105
|
+
const log: string[] = [];
|
|
106
|
+
inner.connect('map', () => void log.push('map'));
|
|
107
|
+
inner.connect('unmap', () => void log.push('unmap'));
|
|
108
|
+
popover.showPopover();
|
|
109
|
+
await settle();
|
|
110
|
+
popover.hidePopover();
|
|
111
|
+
await settle();
|
|
112
|
+
host.remove();
|
|
113
|
+
expect(log).toStrictEqual(['map', 'unmap']);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// `Gtk.Widget`'s `map` / `unmap` signals and `gtk_widget_get_mapped` on an element.
|
|
2
|
+
//
|
|
3
|
+
// A widget is mapped while it is on screen: it is visible and so is every ancestor. Here that is
|
|
4
|
+
// an element in the document that renders (`isConnected && checkVisibility()`), which covers a
|
|
5
|
+
// `hidden` ancestor, a closed `<dialog>`, an inactive stack page and a popover that is not open.
|
|
6
|
+
// `map` fires on the transition into that state and `unmap` on the way out, never on connect.
|
|
7
|
+
//
|
|
8
|
+
// The DOM has no event for either transition, so an element is only WATCHED while something
|
|
9
|
+
// listens to one of the two: one `MutationObserver` on the document (children and attributes,
|
|
10
|
+
// the whole subtree) and a capturing `toggle` listener (a popover opening changes no attribute)
|
|
11
|
+
// re-check every watched element after each batch. A batch is delivered after the change, not
|
|
12
|
+
// inside it as `gtk_widget_show` delivers it; a hide undone within the same turn emits nothing.
|
|
13
|
+
//
|
|
14
|
+
// Order is GTK's post-order (`map` and `unmap` are RUN_FIRST, and the class handler maps or
|
|
15
|
+
// unmaps the children first): the deepest element of a batch emits first, unmaps before maps.
|
|
16
|
+
//
|
|
17
|
+
// Reference: GTK gtk/gtkwidget.c (gtk_widget_map, gtk_widget_unmap, gtk_widget_real_map,
|
|
18
|
+
// gtk_widget_real_unmap, gtk_widget_get_mapped)
|
|
19
|
+
// Copyright (c) GNOME contributors (GTK). LGPLv2.1+.
|
|
20
|
+
|
|
21
|
+
/** Watched elements and the state each last emitted for. */
|
|
22
|
+
const STATE = new WeakMap<HTMLElement, { mapped: boolean; listeners: number }>();
|
|
23
|
+
const WATCHED = new Set<WeakRef<HTMLElement>>();
|
|
24
|
+
const REFS = new WeakMap<HTMLElement, WeakRef<HTMLElement>>();
|
|
25
|
+
let observer: MutationObserver | null = null;
|
|
26
|
+
|
|
27
|
+
/** `gtk_widget_get_mapped`: in the document, and rendered. */
|
|
28
|
+
export function isMapped(el: Element): boolean {
|
|
29
|
+
return el.isConnected && el.checkVisibility();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function depthOf(el: Element): number {
|
|
33
|
+
let depth = 0;
|
|
34
|
+
for (let at = el.parentElement; at !== null; at = at.parentElement) depth++;
|
|
35
|
+
return depth;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function recheck(): void {
|
|
39
|
+
const changed: HTMLElement[] = [];
|
|
40
|
+
for (const ref of WATCHED) {
|
|
41
|
+
const el = ref.deref();
|
|
42
|
+
if (el === undefined) {
|
|
43
|
+
WATCHED.delete(ref);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const state = STATE.get(el)!;
|
|
47
|
+
if (isMapped(el) !== state.mapped) changed.push(el);
|
|
48
|
+
}
|
|
49
|
+
if (changed.length === 0) return;
|
|
50
|
+
const deepestFirst = (list: HTMLElement[]) =>
|
|
51
|
+
list.map((el) => [el, depthOf(el)] as const).sort((a, b) => b[1] - a[1]);
|
|
52
|
+
const unmapped = deepestFirst(changed.filter((el) => STATE.get(el)!.mapped));
|
|
53
|
+
const mapped = deepestFirst(changed.filter((el) => !STATE.get(el)!.mapped));
|
|
54
|
+
for (const [el] of [...unmapped, ...mapped]) {
|
|
55
|
+
const state = STATE.get(el)!;
|
|
56
|
+
state.mapped = !state.mapped;
|
|
57
|
+
el.dispatchEvent(new CustomEvent(state.mapped ? 'map' : 'unmap'));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function observe(): void {
|
|
62
|
+
if (observer !== null) return;
|
|
63
|
+
observer = new MutationObserver(recheck);
|
|
64
|
+
observer.observe(document, { childList: true, subtree: true, attributes: true });
|
|
65
|
+
document.addEventListener('toggle', recheck, true);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function unobserve(): void {
|
|
69
|
+
if (observer === null || WATCHED.size > 0) return;
|
|
70
|
+
observer.disconnect();
|
|
71
|
+
observer = null;
|
|
72
|
+
document.removeEventListener('toggle', recheck, true);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Watches `el` for `map` / `unmap` while the returned function has not been called. Its present
|
|
77
|
+
* state is recorded and not emitted, as connecting a handler in GTK emits nothing.
|
|
78
|
+
*/
|
|
79
|
+
export function watchMapping(el: HTMLElement): () => void {
|
|
80
|
+
let state = STATE.get(el);
|
|
81
|
+
if (state === undefined || state.listeners === 0) {
|
|
82
|
+
state = { mapped: isMapped(el), listeners: 0 };
|
|
83
|
+
STATE.set(el, state);
|
|
84
|
+
const ref = new WeakRef(el);
|
|
85
|
+
REFS.set(el, ref);
|
|
86
|
+
WATCHED.add(ref);
|
|
87
|
+
observe();
|
|
88
|
+
}
|
|
89
|
+
state.listeners++;
|
|
90
|
+
let watching = true;
|
|
91
|
+
return () => {
|
|
92
|
+
if (!watching) return;
|
|
93
|
+
watching = false;
|
|
94
|
+
const current = STATE.get(el)!;
|
|
95
|
+
if (--current.listeners > 0) return;
|
|
96
|
+
WATCHED.delete(REFS.get(el)!);
|
|
97
|
+
REFS.delete(el);
|
|
98
|
+
unobserve();
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// `Gtk.Widget:visible` on a built element: an authored `visible: false`, `get_visible()` /
|
|
2
|
+
// `set_visible()`, the property, and a breakpoint setter that writes it and restores it.
|
|
3
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
4
|
+
import type { SharedTreeNode } from '@gjsify/adwaita-core/conformance';
|
|
5
|
+
|
|
6
|
+
import { Adw, Gtk } from './index.js';
|
|
7
|
+
|
|
8
|
+
import { mountSharedTree } from './shared-tree-builder.js';
|
|
9
|
+
|
|
10
|
+
function settle(): Promise<void> {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type Widget = HTMLElement & { visible: boolean; get_visible(): boolean; set_visible(value: boolean): void };
|
|
17
|
+
|
|
18
|
+
const tree = (width: number, authored: boolean): SharedTreeNode => ({
|
|
19
|
+
tag: 'AdwApplicationWindow',
|
|
20
|
+
props: { 'default-width': width, 'default-height': 400 },
|
|
21
|
+
breakpoints: [
|
|
22
|
+
{
|
|
23
|
+
condition: 'max-width: 599sp',
|
|
24
|
+
setters: [{ object: 'target', property: 'visible', value: false }],
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
children: [
|
|
28
|
+
{
|
|
29
|
+
tag: 'GtkBox',
|
|
30
|
+
slot: 'content',
|
|
31
|
+
children: [{ tag: 'GtkButton', id: 'target', props: authored ? {} : { visible: false } }],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export const AdwWidgetVisibleTest = async () => {
|
|
37
|
+
await describe('adwaita-web: Gtk.Widget:visible on a built element', async () => {
|
|
38
|
+
await it('an authored `visible: false` hides the widget', () => {
|
|
39
|
+
const { root, unmount } = mountSharedTree({
|
|
40
|
+
tag: 'GtkBox',
|
|
41
|
+
children: [{ tag: 'GtkButton', id: 'b', props: { visible: false } }],
|
|
42
|
+
});
|
|
43
|
+
const button = root.querySelector('#b') as Widget;
|
|
44
|
+
expect(button.hidden).toBe(true);
|
|
45
|
+
expect(button.visible).toBe(false);
|
|
46
|
+
expect(button.get_visible()).toBe(false);
|
|
47
|
+
unmount();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await it('is visible by default, and an authored `true` shows it', () => {
|
|
51
|
+
const { root, unmount } = mountSharedTree({
|
|
52
|
+
tag: 'GtkBox',
|
|
53
|
+
children: [
|
|
54
|
+
{ tag: 'GtkButton', id: 'a' },
|
|
55
|
+
{ tag: 'GtkButton', id: 'b', props: { visible: true } },
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
expect((root.querySelector('#a') as Widget).get_visible()).toBe(true);
|
|
59
|
+
expect((root.querySelector('#b') as Widget).hidden).toBe(false);
|
|
60
|
+
unmount();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await it('set_visible() and the property round-trip', () => {
|
|
64
|
+
const { root, unmount } = mountSharedTree({
|
|
65
|
+
tag: 'GtkBox',
|
|
66
|
+
children: [{ tag: 'GtkButton', id: 'b' }],
|
|
67
|
+
});
|
|
68
|
+
const button = root.querySelector('#b') as Widget;
|
|
69
|
+
button.set_visible(false);
|
|
70
|
+
expect(button.hidden).toBe(true);
|
|
71
|
+
button.visible = true;
|
|
72
|
+
expect(button.hidden).toBe(false);
|
|
73
|
+
expect(button.get_visible()).toBe(true);
|
|
74
|
+
unmount();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await it('a breakpoint setter hides the widget and unapplying restores it', async () => {
|
|
78
|
+
const narrow = mountSharedTree(tree(400, true));
|
|
79
|
+
await settle();
|
|
80
|
+
expect((narrow.root.querySelector('#target') as Widget).visible).toBe(false);
|
|
81
|
+
narrow.unmount();
|
|
82
|
+
|
|
83
|
+
const wide = mountSharedTree(tree(1000, true));
|
|
84
|
+
await settle();
|
|
85
|
+
expect((wide.root.querySelector('#target') as Widget).visible).toBe(true);
|
|
86
|
+
wide.unmount();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
await it('unapplying a breakpoint restores an authored `false`', async () => {
|
|
90
|
+
const { root, unmount } = mountSharedTree(tree(1000, false));
|
|
91
|
+
await settle();
|
|
92
|
+
expect((root.querySelector('#target') as Widget).visible).toBe(false);
|
|
93
|
+
unmount();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await it('<gtk-stack-page> and <adw-sidebar> keep their own `visible`', () => {
|
|
97
|
+
const page = document.createElement('gtk-stack-page') as Widget;
|
|
98
|
+
page.visible = false;
|
|
99
|
+
expect(page.hasAttribute('hidden')).toBe(true);
|
|
100
|
+
const item = document.createElement('adw-sidebar-item') as Widget;
|
|
101
|
+
item.visible = false;
|
|
102
|
+
expect(item.getAttribute('visible')).toBe('false');
|
|
103
|
+
expect(item.hasAttribute('hidden')).toBe(true);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
await describe('adwaita-web: Gtk.Widget:visible and tooltip-text on the element class', async () => {
|
|
108
|
+
await it('a created button has visible, get_visible and set_visible, typed on the class', () => {
|
|
109
|
+
const button: Gtk.Button = new Gtk.Button();
|
|
110
|
+
expect(button.visible).toBe(true);
|
|
111
|
+
button.set_visible(false);
|
|
112
|
+
expect(button.hidden).toBe(true);
|
|
113
|
+
expect(button.get_visible()).toBe(false);
|
|
114
|
+
button.visible = true;
|
|
115
|
+
expect(button.hasAttribute('hidden')).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
await it('a created widget that is not a button has them too', () => {
|
|
119
|
+
const box = new Gtk.Box();
|
|
120
|
+
box.visible = false;
|
|
121
|
+
expect(box.hidden).toBe(true);
|
|
122
|
+
expect(box.get_visible()).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
await it('a button has tooltip_text, tooltipText and get/set_tooltip_text over one attribute', () => {
|
|
126
|
+
const button = new Gtk.Button();
|
|
127
|
+
document.body.append(button);
|
|
128
|
+
expect(button.get_tooltip_text()).toBe(null);
|
|
129
|
+
button.set_tooltip_text('Copy');
|
|
130
|
+
expect(button.tooltip_text).toBe('Copy');
|
|
131
|
+
expect(button.tooltipText).toBe('Copy');
|
|
132
|
+
expect(button.getAttribute('tooltip-text')).toBe('Copy');
|
|
133
|
+
expect(button.querySelector('button')?.title).toBe('Copy');
|
|
134
|
+
button.tooltip_text = null;
|
|
135
|
+
expect(button.hasAttribute('tooltip-text')).toBe(false);
|
|
136
|
+
button.remove();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
await it('a row has them and draws the tooltip on its parts', () => {
|
|
140
|
+
const row: Adw.ActionRow = new Adw.ActionRow();
|
|
141
|
+
document.body.append(row);
|
|
142
|
+
row.set_tooltip_text('Hint');
|
|
143
|
+
expect(row.get_tooltip_text()).toBe('Hint');
|
|
144
|
+
expect(row.querySelector('[title="Hint"]') !== null).toBe(true);
|
|
145
|
+
row.remove();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// A maximized or fullscreen `Gtk.Window` ignores its default size and fills the work area
|
|
2
|
+
// (gtkwindow.c); on a page that is the frame's containing block. Driven through layout, because
|
|
3
|
+
// the claim is about the box, not about a class name. One body for the three window elements.
|
|
4
|
+
import { describe, expect, it } from '@gjsify/unit';
|
|
5
|
+
|
|
6
|
+
import type { GtkWindow } from './elements/gtk-window.js';
|
|
7
|
+
|
|
8
|
+
const TAGS = ['gtk-window', 'adw-window', 'adw-application-window'] as const;
|
|
9
|
+
|
|
10
|
+
function mount(tag: string, attrs: Record<string, string> = {}): { el: GtkWindow; host: HTMLElement } {
|
|
11
|
+
const host = document.createElement('div');
|
|
12
|
+
host.style.cssText = 'position:relative;width:500px;height:400px';
|
|
13
|
+
document.body.appendChild(host);
|
|
14
|
+
const el = document.createElement(tag) as GtkWindow;
|
|
15
|
+
el.setAttribute('default-width', '360');
|
|
16
|
+
el.setAttribute('default-height', '240');
|
|
17
|
+
for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
|
|
18
|
+
host.appendChild(el);
|
|
19
|
+
return { el, host };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function size(el: HTMLElement): string {
|
|
23
|
+
const rect = el.getBoundingClientRect();
|
|
24
|
+
return `${Math.round(rect.width)}x${Math.round(rect.height)}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const WindowMaximizeTest = async () => {
|
|
28
|
+
for (const tag of TAGS) {
|
|
29
|
+
await describe(`<${tag}> maximized fills its containing block`, async () => {
|
|
30
|
+
await it('opens at the default size, fills the box maximized, and restores on unmaximize', async () => {
|
|
31
|
+
const { el, host } = mount(tag);
|
|
32
|
+
expect(size(el)).toBe('360x240');
|
|
33
|
+
el.maximize();
|
|
34
|
+
expect(size(el)).toBe('500x400');
|
|
35
|
+
expect(el.style.width).toBe('');
|
|
36
|
+
el.unmaximize();
|
|
37
|
+
expect(size(el)).toBe('360x240');
|
|
38
|
+
host.remove();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await it('fills the box through the `maximized` property and `toggle-maximized`', async () => {
|
|
42
|
+
const { el, host } = mount(tag);
|
|
43
|
+
el.maximized = true;
|
|
44
|
+
expect(size(el)).toBe('500x400');
|
|
45
|
+
el.maximized = false;
|
|
46
|
+
expect(size(el)).toBe('360x240');
|
|
47
|
+
el.dispatchEvent(new CustomEvent('window-action', { detail: { action: 'toggle-maximized' } }));
|
|
48
|
+
expect(size(el)).toBe('500x400');
|
|
49
|
+
el.dispatchEvent(new CustomEvent('window-action', { detail: { action: 'toggle-maximized' } }));
|
|
50
|
+
expect(size(el)).toBe('360x240');
|
|
51
|
+
host.remove();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await it('fills the box fullscreened and restores on unfullscreen', async () => {
|
|
55
|
+
const { el, host } = mount(tag);
|
|
56
|
+
el.fullscreen();
|
|
57
|
+
expect(el.is_fullscreen()).toBe(true);
|
|
58
|
+
expect(size(el)).toBe('500x400');
|
|
59
|
+
el.unfullscreen();
|
|
60
|
+
expect(size(el)).toBe('360x240');
|
|
61
|
+
host.remove();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
await it('stays filled until both states are gone', async () => {
|
|
65
|
+
const { el, host } = mount(tag);
|
|
66
|
+
el.maximize();
|
|
67
|
+
el.fullscreen();
|
|
68
|
+
el.unmaximize();
|
|
69
|
+
expect(size(el)).toBe('500x400');
|
|
70
|
+
el.unfullscreen();
|
|
71
|
+
expect(size(el)).toBe('360x240');
|
|
72
|
+
host.remove();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await it('fills the box already maximized when it is connected', async () => {
|
|
76
|
+
const { el, host } = mount(tag, { maximized: 'true' });
|
|
77
|
+
expect(size(el)).toBe('500x400');
|
|
78
|
+
host.remove();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
await describe('<adw-window> maximized keeps its size request as a minimum', async () => {
|
|
84
|
+
await it('does not shrink below width-request/height-request', async () => {
|
|
85
|
+
const { el, host } = mount('adw-window', { 'width-request': '600', 'height-request': '450' });
|
|
86
|
+
el.maximize();
|
|
87
|
+
const [width, height] = size(el).split('x').map(Number);
|
|
88
|
+
expect(width >= 600).toBe(true);
|
|
89
|
+
expect(height >= 450).toBe(true);
|
|
90
|
+
host.remove();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Make `name` drawable by every `.adw-icon` in the document, from an Adwaita symbolic SVG
|
|
3
|
-
* source string (what `@gjsify/adwaita-icons` exports).
|
|
4
|
-
*
|
|
5
|
-
* BOTH arguments are checked and a wrong one THROWS rather than registering nothing: unlike
|
|
6
|
-
* a render, this is an explicit call with a wrong argument, and silently doing nothing is
|
|
7
|
-
* the failure mode this whole area exists to end. The name is normalized exactly as
|
|
8
|
-
* `<gtk-image icon-name>` normalizes it — a single `-symbolic` suffix comes off, and the rest
|
|
9
|
-
* must be one CSS token; the SVG has to parse to an `<svg>` root. `<gtk-image>` draws
|
|
10
|
-
* `image-missing` for the same unusable name instead — there it came from markup, and
|
|
11
|
-
* taking the page down over a typo is not proportionate.
|
|
12
|
-
*
|
|
13
|
-
* Registering a name the stylesheet already compiles is allowed and REPLACES the glyph:
|
|
14
|
-
* the property is set on the document element, so it wins over the `:root` rule.
|
|
15
|
-
*
|
|
16
|
-
* CLIENT-SIDE ONLY: this touches `document.documentElement` and `document.head`, so at
|
|
17
|
-
* module top level in an SSR/SSG build it throws before a page is rendered.
|
|
18
|
-
*/
|
|
19
|
-
export declare function registerIcon(name: string, svg: string): void;
|
|
20
|
-
/**
|
|
21
|
-
* Whether `name` draws something other than `image-missing` — a symbolic glyph compiled into
|
|
22
|
-
* the stylesheet or registered at runtime, or a colour icon from `registerColorIcon`. The
|
|
23
|
-
* name is looked up exactly as `<gtk-image icon-name>` looks it up (`icon-theme.ts`).
|
|
24
|
-
*
|
|
25
|
-
* Reads the live cascade rather than a generated list, so it answers for a glyph that
|
|
26
|
-
* arrived by any route, including a consumer's own `--icon-<name>` declaration. It is
|
|
27
|
-
* deliberately the CUSTOM PROPERTY that is read and not the rendered `mask-image` of a
|
|
28
|
-
* probe element: since `_icon.scss` gives every icon box the `image-missing` fallback,
|
|
29
|
-
* a rendered mask is never `none`, and comparing against the fallback would answer
|
|
30
|
-
* `false` for `image-missing` itself — the one name where being drawn and having fallen
|
|
31
|
-
* back look identical.
|
|
32
|
-
*
|
|
33
|
-
* Narrowing worth knowing: a consumer who writes `.adw-icon--x { mask-image: url(…) }`
|
|
34
|
-
* with no matching `--icon-x` gets `false` here and a drawn icon anyway. The generator and
|
|
35
|
-
* {@link registerIcon} are the two things that create the pair, and both create both.
|
|
36
|
-
*/
|
|
37
|
-
export declare function isIconAvailable(name: string): boolean;
|