@gjsify/adwaita-web 0.54.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/adwaita-web.css +8146 -3011
- package/dist/adwaita-web.css.map +1 -1
- package/lib/types/adw-application-window.spec.d.ts +1 -0
- package/lib/types/adw-bin.spec.d.ts +1 -0
- package/lib/types/adw-breakpoint-bin.spec.d.ts +1 -0
- package/lib/types/adw-clamp-scrollable.spec.d.ts +1 -0
- package/lib/types/adw-multi-layout-view.spec.d.ts +1 -0
- package/lib/types/adw-preferences-row.spec.d.ts +1 -0
- package/lib/types/adw-shortcuts.spec.d.ts +1 -0
- package/lib/types/adw-status-page.spec.d.ts +1 -0
- package/lib/types/adw-tab-bar.spec.d.ts +1 -0
- package/lib/types/adw-tab-button.spec.d.ts +1 -0
- package/lib/types/adw-tab-overview.spec.d.ts +1 -0
- package/lib/types/adw-view-switcher-sidebar.spec.d.ts +1 -0
- package/lib/types/adw-window.spec.d.ts +1 -0
- package/lib/types/attributes.d.ts +19 -0
- package/lib/types/breakpoints.d.ts +14 -3
- package/lib/types/construct-vectors.spec.d.ts +1 -0
- package/lib/types/elements/adw-action-row.d.ts +4 -0
- package/lib/types/elements/adw-application-window.d.ts +27 -0
- package/lib/types/elements/adw-bin.d.ts +17 -0
- package/lib/types/elements/adw-breakpoint-bin.d.ts +67 -0
- package/lib/types/elements/adw-clamp-scrollable.d.ts +38 -0
- package/lib/types/elements/adw-combo-row.d.ts +4 -0
- package/lib/types/elements/adw-dialog.d.ts +10 -0
- package/lib/types/elements/adw-entry-row.d.ts +6 -0
- package/lib/types/elements/adw-expander-row.d.ts +2 -0
- package/lib/types/elements/adw-header-bar.d.ts +6 -0
- package/lib/types/elements/adw-layout-slot.d.ts +19 -0
- package/lib/types/elements/adw-multi-layout-view.d.ts +101 -0
- package/lib/types/elements/adw-overlay-split-view.d.ts +13 -0
- package/lib/types/elements/adw-preferences-row.d.ts +31 -0
- package/lib/types/elements/adw-shortcuts-dialog.d.ts +13 -0
- package/lib/types/elements/adw-shortcuts-item.d.ts +36 -0
- package/lib/types/elements/adw-shortcuts-section.d.ts +14 -0
- package/lib/types/elements/adw-sidebar.d.ts +8 -2
- package/lib/types/elements/adw-spin-row.d.ts +6 -0
- package/lib/types/elements/adw-switch-row.d.ts +7 -0
- package/lib/types/elements/adw-tab-bar.d.ts +108 -0
- package/lib/types/elements/adw-tab-button.d.ts +32 -0
- package/lib/types/elements/adw-tab-overview.d.ts +199 -0
- package/lib/types/elements/adw-tab-view.d.ts +19 -23
- package/lib/types/elements/adw-toggle-group.d.ts +17 -0
- package/lib/types/elements/adw-view-switcher-sidebar.d.ts +84 -0
- package/lib/types/elements/adw-window.d.ts +40 -0
- package/lib/types/elements/gtk-about-dialog.d.ts +146 -0
- package/lib/types/elements/gtk-application-window.d.ts +34 -0
- package/lib/types/elements/gtk-aspect-frame.d.ts +27 -0
- package/lib/types/elements/gtk-button.d.ts +9 -0
- package/lib/types/elements/gtk-calendar.d.ts +159 -0
- package/lib/types/elements/gtk-center-box.d.ts +39 -0
- package/lib/types/elements/gtk-color-dialog-button.d.ts +69 -0
- package/lib/types/elements/gtk-column-view.d.ts +50 -0
- package/lib/types/elements/gtk-drag-icon.d.ts +78 -0
- package/lib/types/elements/gtk-drawing-area.d.ts +95 -0
- package/lib/types/elements/gtk-editable-label.d.ts +33 -0
- package/lib/types/elements/gtk-emoji-chooser.d.ts +84 -0
- package/lib/types/elements/gtk-entry.d.ts +20 -1
- package/lib/types/elements/gtk-expander.d.ts +49 -0
- package/lib/types/elements/gtk-fixed.d.ts +13 -0
- package/lib/types/elements/gtk-flow-box-child.d.ts +14 -0
- package/lib/types/elements/gtk-flow-box.d.ts +87 -0
- package/lib/types/elements/gtk-font-dialog-button.d.ts +83 -0
- package/lib/types/elements/gtk-frame.d.ts +24 -0
- package/lib/types/elements/gtk-gl-area.d.ts +136 -0
- package/lib/types/elements/gtk-graphics-offload.d.ts +24 -0
- package/lib/types/elements/gtk-grid-view.d.ts +39 -0
- package/lib/types/elements/gtk-grid.d.ts +27 -0
- package/lib/types/elements/gtk-header-bar.d.ts +60 -0
- package/lib/types/elements/gtk-inscription.d.ts +64 -0
- package/lib/types/elements/gtk-label.d.ts +3 -0
- package/lib/types/elements/gtk-level-bar.d.ts +59 -0
- package/lib/types/elements/gtk-link-button.d.ts +29 -0
- package/lib/types/elements/gtk-list-box-row.d.ts +54 -0
- package/lib/types/elements/gtk-list-box.d.ts +100 -0
- package/lib/types/elements/gtk-list-view.d.ts +73 -0
- package/lib/types/elements/gtk-media-controls.d.ts +142 -0
- package/lib/types/elements/gtk-notebook.d.ts +148 -0
- package/lib/types/elements/gtk-overlay.d.ts +22 -0
- package/lib/types/elements/gtk-page-setup-unix-dialog.d.ts +87 -0
- package/lib/types/elements/gtk-paned.d.ts +121 -0
- package/lib/types/elements/gtk-password-entry.d.ts +27 -0
- package/lib/types/elements/gtk-picture.d.ts +66 -0
- package/lib/types/elements/gtk-popover-bin.d.ts +82 -0
- package/lib/types/elements/gtk-popover-menu-bar.d.ts +66 -0
- package/lib/types/elements/gtk-popover-menu.d.ts +83 -0
- package/lib/types/elements/gtk-popover.d.ts +28 -3
- package/lib/types/elements/gtk-print-unix-dialog.d.ts +167 -0
- package/lib/types/elements/gtk-revealer.d.ts +55 -0
- package/lib/types/elements/gtk-scale-button.d.ts +59 -0
- package/lib/types/elements/gtk-scale.d.ts +98 -0
- package/lib/types/elements/gtk-scrollbar.d.ts +124 -0
- package/lib/types/elements/gtk-scrolled-window.d.ts +129 -0
- package/lib/types/elements/gtk-search-bar.d.ts +39 -0
- package/lib/types/elements/gtk-search-entry.d.ts +27 -0
- package/lib/types/elements/gtk-separator.d.ts +10 -0
- package/lib/types/elements/gtk-spin-button.d.ts +94 -0
- package/lib/types/elements/gtk-spinner.d.ts +14 -0
- package/lib/types/elements/gtk-stack-sidebar.d.ts +43 -0
- package/lib/types/elements/gtk-stack-switcher.d.ts +58 -0
- package/lib/types/elements/gtk-stack.d.ts +154 -0
- package/lib/types/elements/gtk-switch.d.ts +4 -1
- package/lib/types/elements/gtk-text-view.d.ts +62 -0
- package/lib/types/elements/gtk-text.d.ts +45 -0
- package/lib/types/elements/gtk-toggle-button.d.ts +45 -0
- package/lib/types/elements/gtk-tree-expander.d.ts +38 -0
- package/lib/types/elements/gtk-video.d.ts +97 -0
- package/lib/types/elements/gtk-viewport.d.ts +84 -0
- package/lib/types/elements/gtk-window-controls.d.ts +80 -0
- package/lib/types/elements/gtk-window-handle.d.ts +39 -0
- package/lib/types/elements/gtk-window.d.ts +103 -0
- package/lib/types/elements/justification.d.ts +2 -0
- package/lib/types/elements/popover-menu.d.ts +18 -0
- package/lib/types/elements/roving-focus.d.ts +29 -1
- package/lib/types/emoji-data.d.ts +38 -0
- package/lib/types/font-description.d.ts +96 -0
- package/lib/types/gtk-about-dialog.spec.d.ts +1 -0
- package/lib/types/gtk-action-bar.spec.d.ts +1 -0
- package/lib/types/gtk-application-window.spec.d.ts +1 -0
- package/lib/types/gtk-aspect-frame.spec.d.ts +1 -0
- package/lib/types/gtk-calendar.spec.d.ts +1 -0
- package/lib/types/gtk-center-box.spec.d.ts +1 -0
- package/lib/types/gtk-color-dialog-button.spec.d.ts +1 -0
- package/lib/types/gtk-column-view.spec.d.ts +1 -0
- package/lib/types/gtk-drag-icon.spec.d.ts +1 -0
- package/lib/types/gtk-drawing-area.spec.d.ts +1 -0
- package/lib/types/gtk-editable-label.spec.d.ts +1 -0
- package/lib/types/gtk-emoji-chooser.spec.d.ts +1 -0
- package/lib/types/gtk-expander.spec.d.ts +1 -0
- package/lib/types/gtk-fixed.spec.d.ts +1 -0
- package/lib/types/gtk-flow-box.spec.d.ts +1 -0
- package/lib/types/gtk-font-dialog-button.spec.d.ts +1 -0
- package/lib/types/gtk-frame.spec.d.ts +1 -0
- package/lib/types/gtk-gl-area.spec.d.ts +1 -0
- package/lib/types/gtk-graphics-offload.spec.d.ts +1 -0
- package/lib/types/gtk-grid-view.spec.d.ts +1 -0
- package/lib/types/gtk-grid.spec.d.ts +1 -0
- package/lib/types/gtk-header-bar.spec.d.ts +1 -0
- package/lib/types/gtk-inscription.spec.d.ts +1 -0
- package/lib/types/gtk-level-bar.spec.d.ts +1 -0
- package/lib/types/gtk-link-button.spec.d.ts +1 -0
- package/lib/types/gtk-list-box.spec.d.ts +1 -0
- package/lib/types/gtk-list-view.spec.d.ts +1 -0
- package/lib/types/gtk-media-controls.spec.d.ts +1 -0
- package/lib/types/gtk-notebook.spec.d.ts +1 -0
- package/lib/types/gtk-overlay.spec.d.ts +1 -0
- package/lib/types/gtk-paned.spec.d.ts +1 -0
- package/lib/types/gtk-password-entry.spec.d.ts +1 -0
- package/lib/types/gtk-picture.spec.d.ts +1 -0
- package/lib/types/gtk-popover-bin.spec.d.ts +1 -0
- package/lib/types/gtk-popover-menu-bar.spec.d.ts +1 -0
- package/lib/types/gtk-popover-menu.spec.d.ts +1 -0
- package/lib/types/gtk-popover-role.spec.d.ts +1 -0
- package/lib/types/gtk-popover.spec.d.ts +1 -0
- package/lib/types/gtk-print-dialogs.spec.d.ts +1 -0
- package/lib/types/gtk-revealer.spec.d.ts +1 -0
- package/lib/types/gtk-scale-button.spec.d.ts +1 -0
- package/lib/types/gtk-scale.spec.d.ts +1 -0
- package/lib/types/gtk-scrollbar.spec.d.ts +1 -0
- package/lib/types/gtk-scrolled-window.spec.d.ts +1 -0
- package/lib/types/gtk-search-bar.spec.d.ts +1 -0
- package/lib/types/gtk-search-entry.spec.d.ts +1 -0
- package/lib/types/gtk-separator.spec.d.ts +1 -0
- package/lib/types/gtk-spin-button.spec.d.ts +1 -0
- package/lib/types/gtk-spinner.spec.d.ts +1 -0
- package/lib/types/gtk-stack-sidebar.spec.d.ts +1 -0
- package/lib/types/gtk-stack-switcher.spec.d.ts +1 -0
- package/lib/types/gtk-stack.spec.d.ts +1 -0
- package/lib/types/gtk-text-view.spec.d.ts +1 -0
- package/lib/types/gtk-text.spec.d.ts +1 -0
- package/lib/types/gtk-toggle-button.spec.d.ts +1 -0
- package/lib/types/gtk-tree-expander.spec.d.ts +1 -0
- package/lib/types/gtk-video.spec.d.ts +1 -0
- package/lib/types/gtk-viewport.spec.d.ts +1 -0
- package/lib/types/gtk-window-controls.spec.d.ts +1 -0
- package/lib/types/gtk-window-handle.spec.d.ts +1 -0
- package/lib/types/gtk-window.spec.d.ts +1 -0
- package/lib/types/index.d.ts +4 -1
- package/lib/types/list-view-dom.d.ts +44 -0
- package/lib/types/namespace/adw.d.ts +12 -0
- package/lib/types/namespace/gtk.d.ts +61 -0
- package/lib/types/page-setup.d.ts +100 -0
- package/lib/types/row-line-clamp.d.ts +20 -0
- package/lib/types/row-tooltip.d.ts +8 -0
- package/lib/types/row-tooltip.spec.d.ts +1 -0
- package/lib/types/scroll-shading.d.ts +15 -1
- package/lib/types/shared-tree-builder.d.ts +75 -17
- package/lib/types/shared-tree-mount.spec.d.ts +1 -0
- package/lib/types/signals.d.ts +4 -0
- package/lib/types/styles.generated.d.ts +1 -1
- package/lib/types/tab-chip.d.ts +73 -0
- package/lib/types/template-classes.d.ts +11 -0
- package/lib/types/widget-size.spec.d.ts +1 -0
- package/package.json +12 -8
- package/scss/_action_row.scss +41 -17
- package/scss/_application_window.scss +26 -0
- package/scss/_aspect_frame.scss +25 -0
- package/scss/_bin.scss +26 -0
- package/scss/_button.scss +45 -0
- package/scss/_button_row.scss +5 -0
- package/scss/_calendar.scss +176 -0
- package/scss/_center_box.scss +25 -0
- package/scss/_checks.scss +6 -1
- package/scss/_clamp_scrollable.scss +28 -0
- package/scss/_color_button.scss +67 -0
- package/scss/_column_view.scss +126 -0
- package/scss/_drag_icon.scss +55 -0
- package/scss/_drawing.scss +85 -0
- package/scss/_emoji_chooser.scss +213 -0
- package/scss/_entry.scss +13 -5
- package/scss/_entry_row.scss +1 -1
- package/scss/_expander.scss +113 -0
- package/scss/_expander_row.scss +36 -3
- package/scss/_fixed.scss +29 -0
- package/scss/_flow_box.scss +94 -0
- package/scss/_font_button.scss +63 -0
- package/scss/_frame.scss +41 -0
- package/scss/_grid.scss +19 -0
- package/scss/_grid_view.scss +46 -0
- package/scss/_gtk_about_dialog.scss +186 -0
- package/scss/_headerbar.scss +134 -1
- package/scss/_icons.generated.scss +186 -0
- package/scss/_inscription.scss +125 -0
- package/scss/_level_bar.scss +190 -0
- package/scss/_link.scss +82 -0
- package/scss/_list_box.scss +88 -0
- package/scss/_list_view.scss +96 -0
- package/scss/_media_controls.scss +139 -0
- package/scss/_overlay.scss +68 -0
- package/scss/_paned.scss +130 -0
- package/scss/_password_entry.scss +83 -0
- package/scss/_picture.scss +80 -0
- package/scss/_popover_bin.scss +53 -0
- package/scss/_popover_menu_bar.scss +104 -0
- package/scss/_preferences_row.scss +60 -0
- package/scss/_print_dialogs.scss +328 -0
- package/scss/_reset.scss +21 -19
- package/scss/_revealer.scss +37 -0
- package/scss/_row.scss +36 -5
- package/scss/_scale.scss +298 -0
- package/scss/_scale_button.scss +167 -0
- package/scss/_scrollbar.scss +230 -0
- package/scss/_scrolled_window.scss +131 -0
- package/scss/_search_bar.scss +118 -0
- package/scss/_search_entry.scss +86 -0
- package/scss/_separator.scss +44 -0
- package/scss/_shortcuts_dialog.scss +100 -0
- package/scss/_spin_button.scss +172 -0
- package/scss/_spin_row.scss +56 -8
- package/scss/_spinner.scss +85 -4
- package/scss/_stack.scss +729 -0
- package/scss/_status_page.scss +1 -1
- package/scss/_switch.scss +13 -5
- package/scss/_switch_row.scss +10 -0
- package/scss/_tab_bar.scss +317 -0
- package/scss/_tab_button.scss +98 -0
- package/scss/_tab_overview.scss +483 -0
- package/scss/_text.scss +182 -0
- package/scss/_theme.scss +1 -1
- package/scss/_toggle_group.scss +28 -0
- package/scss/_tree_expander.scss +62 -0
- package/scss/_variables.scss +1 -1
- package/scss/_video.scss +146 -0
- package/scss/_view_switcher_sidebar.scss +112 -0
- package/scss/_viewport.scss +50 -0
- package/scss/_widget.scss +14 -3
- package/scss/_window.scss +131 -2
- package/scss/_window_handle.scss +20 -0
- package/scss/adwaita-skin.scss +109 -0
- package/src/adw-action-rows.spec.ts +331 -0
- package/src/adw-application-window.spec.ts +118 -0
- package/src/adw-bin.spec.ts +75 -0
- package/src/adw-breakpoint-bin.spec.ts +324 -0
- package/src/adw-clamp-scrollable.spec.ts +189 -0
- package/src/adw-header-bar.spec.ts +18 -0
- package/src/adw-multi-layout-view.spec.ts +243 -0
- package/src/adw-preferences-row.spec.ts +164 -0
- package/src/adw-row-state.spec.ts +142 -0
- package/src/adw-shortcuts.spec.ts +155 -0
- package/src/adw-status-page.spec.ts +124 -0
- package/src/adw-tab-bar.spec.ts +287 -0
- package/src/adw-tab-button.spec.ts +101 -0
- package/src/adw-tab-overview.spec.ts +443 -0
- package/src/adw-view-switcher-sidebar.spec.ts +281 -0
- package/src/adw-window.spec.ts +129 -0
- package/src/attributes.ts +52 -0
- package/src/breakpoints.ts +25 -8
- package/src/capabilities.d.mts +3 -0
- package/src/capabilities.mjs +21 -0
- package/src/connect-lifecycle.spec.ts +12 -0
- package/src/construct-vectors.spec.ts +175 -0
- package/src/elements/adw-action-row.ts +31 -2
- package/src/elements/adw-alert-dialog.ts +4 -1
- package/src/elements/adw-application-window.ts +154 -0
- package/src/elements/adw-bin.ts +101 -0
- package/src/elements/adw-breakpoint-bin.ts +287 -0
- package/src/elements/adw-button-row.ts +7 -1
- package/src/elements/adw-clamp-scrollable.ts +207 -0
- package/src/elements/adw-combo-row.ts +26 -1
- package/src/elements/adw-dialog.ts +19 -0
- package/src/elements/adw-entry-row.ts +22 -12
- package/src/elements/adw-expander-row.ts +34 -1
- package/src/elements/adw-header-bar.ts +18 -4
- package/src/elements/adw-layout-slot.ts +95 -0
- package/src/elements/adw-multi-layout-view.ts +326 -0
- package/src/elements/adw-overlay-split-view.ts +29 -6
- package/src/elements/adw-preferences-row.ts +153 -0
- package/src/elements/adw-shortcuts-dialog.ts +52 -0
- package/src/elements/adw-shortcuts-item.ts +171 -0
- package/src/elements/adw-shortcuts-section.ts +86 -0
- package/src/elements/adw-sidebar.ts +74 -7
- package/src/elements/adw-spin-row.ts +37 -2
- package/src/elements/adw-status-page.ts +10 -2
- package/src/elements/adw-switch-row.ts +53 -2
- package/src/elements/adw-tab-bar.ts +529 -0
- package/src/elements/adw-tab-button.ts +194 -0
- package/src/elements/adw-tab-overview.ts +1011 -0
- package/src/elements/adw-tab-view.ts +66 -145
- package/src/elements/adw-toggle-group.ts +138 -14
- package/src/elements/adw-view-stack.ts +18 -0
- package/src/elements/adw-view-switcher-sidebar.ts +332 -0
- package/src/elements/adw-window.ts +190 -11
- package/src/elements/checks.ts +35 -8
- package/src/elements/gtk-about-dialog.ts +811 -0
- package/src/elements/gtk-application-window.ts +108 -0
- package/src/elements/gtk-aspect-frame.ts +160 -0
- package/src/elements/gtk-button.ts +12 -0
- package/src/elements/gtk-calendar.ts +757 -0
- package/src/elements/gtk-center-box.ts +184 -0
- package/src/elements/gtk-color-dialog-button.ts +278 -0
- package/src/elements/gtk-column-view.ts +320 -0
- package/src/elements/gtk-drag-icon.ts +257 -0
- package/src/elements/gtk-drawing-area.ts +303 -0
- package/src/elements/gtk-editable-label.ts +204 -0
- package/src/elements/gtk-emoji-chooser.ts +542 -0
- package/src/elements/gtk-entry.ts +39 -5
- package/src/elements/gtk-expander.ts +301 -0
- package/src/elements/gtk-fixed.ts +99 -0
- package/src/elements/gtk-flow-box-child.ts +68 -0
- package/src/elements/gtk-flow-box.ts +480 -0
- package/src/elements/gtk-font-dialog-button.ts +432 -0
- package/src/elements/gtk-frame.ts +174 -0
- package/src/elements/gtk-gl-area.ts +476 -0
- package/src/elements/gtk-graphics-offload.ts +130 -0
- package/src/elements/gtk-grid-view.ts +168 -0
- package/src/elements/gtk-grid.ts +127 -0
- package/src/elements/gtk-header-bar.ts +273 -0
- package/src/elements/gtk-inscription.ts +387 -0
- package/src/elements/gtk-label.ts +19 -11
- package/src/elements/gtk-level-bar.ts +323 -0
- package/src/elements/gtk-link-button.ts +138 -0
- package/src/elements/gtk-list-box-row.ts +195 -0
- package/src/elements/gtk-list-box.ts +413 -0
- package/src/elements/gtk-list-view.ts +370 -0
- package/src/elements/gtk-media-controls.ts +509 -0
- package/src/elements/gtk-notebook.ts +664 -0
- package/src/elements/gtk-overlay.ts +149 -0
- package/src/elements/gtk-page-setup-unix-dialog.ts +420 -0
- package/src/elements/gtk-paned.ts +597 -0
- package/src/elements/gtk-password-entry.ts +170 -0
- package/src/elements/gtk-picture.ts +254 -0
- package/src/elements/gtk-popover-bin.ts +332 -0
- package/src/elements/gtk-popover-menu-bar.ts +355 -0
- package/src/elements/gtk-popover-menu.ts +339 -0
- package/src/elements/gtk-popover.ts +92 -10
- package/src/elements/gtk-print-unix-dialog.ts +989 -0
- package/src/elements/gtk-progress-bar.ts +24 -11
- package/src/elements/gtk-revealer.ts +406 -0
- package/src/elements/gtk-scale-button.ts +358 -0
- package/src/elements/gtk-scale.ts +492 -0
- package/src/elements/gtk-scrollbar.ts +528 -0
- package/src/elements/gtk-scrolled-window.ts +653 -0
- package/src/elements/gtk-search-bar.ts +200 -0
- package/src/elements/gtk-search-entry.ts +172 -0
- package/src/elements/gtk-separator.ts +52 -0
- package/src/elements/gtk-spin-button.ts +475 -0
- package/src/elements/gtk-spinner.ts +126 -0
- package/src/elements/gtk-stack-sidebar.ts +212 -0
- package/src/elements/gtk-stack-switcher.ts +279 -0
- package/src/elements/gtk-stack.ts +748 -0
- package/src/elements/gtk-switch.ts +52 -19
- package/src/elements/gtk-text-view.ts +290 -0
- package/src/elements/gtk-text.ts +219 -0
- package/src/elements/gtk-toggle-button.ts +239 -0
- package/src/elements/gtk-tree-expander.ts +243 -0
- package/src/elements/gtk-video.ts +423 -0
- package/src/elements/gtk-viewport.ts +277 -0
- package/src/elements/gtk-window-controls.ts +341 -0
- package/src/elements/gtk-window-handle.ts +221 -0
- package/src/elements/gtk-window.ts +372 -0
- package/src/elements/justification.ts +24 -0
- package/src/elements/popover-menu.ts +24 -0
- package/src/elements/roving-focus.ts +53 -21
- package/src/emoji-data.ts +577 -0
- package/src/entry-rows.spec.ts +31 -0
- package/src/font-description.ts +238 -0
- package/src/gtk-about-dialog.spec.ts +250 -0
- package/src/gtk-action-bar.spec.ts +89 -0
- package/src/gtk-application-window.spec.ts +107 -0
- package/src/gtk-aspect-frame.spec.ts +114 -0
- package/src/gtk-calendar.spec.ts +589 -0
- package/src/gtk-center-box.spec.ts +125 -0
- package/src/gtk-color-dialog-button.spec.ts +141 -0
- package/src/gtk-column-view.spec.ts +154 -0
- package/src/gtk-drag-icon.spec.ts +190 -0
- package/src/gtk-drawing-area.spec.ts +211 -0
- package/src/gtk-editable-label.spec.ts +190 -0
- package/src/gtk-emoji-chooser.spec.ts +173 -0
- package/src/gtk-entry.spec.ts +23 -0
- package/src/gtk-expander.spec.ts +170 -0
- package/src/gtk-fixed.spec.ts +97 -0
- package/src/gtk-flow-box.spec.ts +289 -0
- package/src/gtk-font-dialog-button.spec.ts +166 -0
- package/src/gtk-frame.spec.ts +119 -0
- package/src/gtk-gl-area.spec.ts +361 -0
- package/src/gtk-graphics-offload.spec.ts +119 -0
- package/src/gtk-grid-view.spec.ts +106 -0
- package/src/gtk-grid.spec.ts +122 -0
- package/src/gtk-header-bar.spec.ts +202 -0
- package/src/gtk-inscription.spec.ts +235 -0
- package/src/gtk-level-bar.spec.ts +199 -0
- package/src/gtk-link-button.spec.ts +117 -0
- package/src/gtk-list-box.spec.ts +422 -0
- package/src/gtk-list-view.spec.ts +203 -0
- package/src/gtk-media-controls.spec.ts +295 -0
- package/src/gtk-notebook.spec.ts +546 -0
- package/src/gtk-overlay.spec.ts +141 -0
- package/src/gtk-paned.spec.ts +267 -0
- package/src/gtk-password-entry.spec.ts +150 -0
- package/src/gtk-picture.spec.ts +172 -0
- package/src/gtk-popover-bin.spec.ts +229 -0
- package/src/gtk-popover-menu-bar.spec.ts +296 -0
- package/src/gtk-popover-menu.spec.ts +261 -0
- package/src/gtk-popover-role.spec.ts +138 -0
- package/src/gtk-popover.spec.ts +264 -0
- package/src/gtk-print-dialogs.spec.ts +251 -0
- package/src/gtk-revealer.spec.ts +164 -0
- package/src/gtk-scale-button.spec.ts +218 -0
- package/src/gtk-scale.spec.ts +213 -0
- package/src/gtk-scrollbar.spec.ts +244 -0
- package/src/gtk-scrolled-window.spec.ts +262 -0
- package/src/gtk-search-bar.spec.ts +179 -0
- package/src/gtk-search-entry.spec.ts +142 -0
- package/src/gtk-separator.spec.ts +74 -0
- package/src/gtk-spin-button.spec.ts +186 -0
- package/src/gtk-spinner.spec.ts +130 -0
- package/src/gtk-stack-sidebar.spec.ts +217 -0
- package/src/gtk-stack-switcher.spec.ts +249 -0
- package/src/gtk-stack.spec.ts +432 -0
- package/src/gtk-text-view.spec.ts +189 -0
- package/src/gtk-text.spec.ts +163 -0
- package/src/gtk-toggle-button.spec.ts +186 -0
- package/src/gtk-tree-expander.spec.ts +201 -0
- package/src/gtk-video.spec.ts +240 -0
- package/src/gtk-viewport.spec.ts +140 -0
- package/src/gtk-window-controls.spec.ts +232 -0
- package/src/gtk-window-handle.spec.ts +158 -0
- package/src/gtk-window.spec.ts +202 -0
- package/src/index.ts +9 -1
- package/src/keyboard-operable.spec.ts +77 -9
- package/src/list-view-dom.ts +121 -0
- package/src/namespace/adw.ts +12 -0
- package/src/namespace/gtk.ts +61 -0
- package/src/page-setup.ts +222 -0
- package/src/row-line-clamp.ts +74 -0
- package/src/row-tooltip.spec.ts +313 -0
- package/src/row-tooltip.ts +52 -0
- package/src/scroll-shading.ts +18 -1
- package/src/shared-tree-builder.ts +336 -41
- package/src/shared-tree-mount.spec.ts +130 -0
- package/src/shared-trees.spec.ts +15 -0
- package/src/signals.ts +15 -0
- package/src/style-classes.spec.ts +9 -8
- package/src/styles.generated.ts +1 -1
- package/src/tab-chip.ts +200 -0
- package/src/template-classes.ts +45 -0
- package/src/test.browser.mts +160 -0
- package/src/widget-size.spec.ts +117 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
// <gtk-scale> — a slider: a trough, the highlighted part of it and a knob you drag.
|
|
2
|
+
//
|
|
3
|
+
// `Gtk.Scale` EXTENDS `Gtk.Range`, and `Gtk.Range` is CONCRETE — `gtk_range_get_type()`
|
|
4
|
+
// is registered with a bare `G_DEFINE_TYPE_WITH_CODE` (gtkrange.c:267), with no
|
|
5
|
+
// `G_TYPE_FLAG_ABSTRACT` anywhere in it. GTK still only ever builds one as the BASE of a
|
|
6
|
+
// subclass, so it has no tag of its own here and no block: its whole surface is this
|
|
7
|
+
// widget's and `Gtk.Scrollbar`'s — the adjustment, the value, `inverted`, the fill level
|
|
8
|
+
// and `round-digits` are `Gtk.Range` properties carried by `<gtk-scale>` and
|
|
9
|
+
// `<gtk-scrollbar>`, which is where they are documented.
|
|
10
|
+
//
|
|
11
|
+
// THE RANGE IS HEADLESS: `SpinState` from `@gjsify/adwaita-core` IS the portable
|
|
12
|
+
// `Gtk.Adjustment` (ADR 0047) — the six numbers, the clamp and the two signals — and
|
|
13
|
+
// `<adw-spin-row>` and `<adw-spinner>`'s siblings already hold one. `coord_to_value`
|
|
14
|
+
// (gtkrange.c) and `gtk_range_real_change_value` (gtkrange.c) are ported here literally.
|
|
15
|
+
//
|
|
16
|
+
// A NOTE ON THE `Gtk.Range` PROPERTIES THE WIDGET DOES NOT OBSERVE: none — the four
|
|
17
|
+
// `GtkScale` scalars (`digits`, `draw-value`, `has-origin`, `value-pos`) and the
|
|
18
|
+
// `GtkRange` ones are all attributes here, which is what keeps `KNOWN_GAPS` in
|
|
19
|
+
// `scripts/check-adwaita-element-properties.mjs` without an entry for this tag.
|
|
20
|
+
//
|
|
21
|
+
// NOT PORTED: the `marks` subnodes. `gtk_scale_add_mark()` / `clear_marks()` are
|
|
22
|
+
// DEPRECATED since GTK 4.10 and the marks widget is built only by them, so libadwaita's
|
|
23
|
+
// `.marks-before` / `.marks-after` rules (`_scale.scss:98-111`, `:152-170`, `:212-226`)
|
|
24
|
+
// and its `> marks` blocks have nothing here that can select them. The same file's
|
|
25
|
+
// `.fine-tune` rules (`:137-150`, `:197-210`) key on a style class `GtkRange` adds for
|
|
26
|
+
// the duration of a Shift-held drag (`gtkrange.c:1799-1801`) — this element's pointer
|
|
27
|
+
// handling does not run that zoom state, so it has no `.fine-tune` either. And `.color`
|
|
28
|
+
// (`:229-250`) belongs to `Gtk.ScaleButton`, which adds it itself.
|
|
29
|
+
//
|
|
30
|
+
// Reference: refs/libadwaita/src/stylesheet/widgets/_scale.scss:1-251
|
|
31
|
+
// Reference: refs/libadwaita/src/stylesheet/_colors.scss:280-289 (the trough and slider colours)
|
|
32
|
+
// Reference: refs/gtk/gtk/gtkrange.c (coord_to_value, gtk_range_real_change_value, should_invert)
|
|
33
|
+
// Reference: refs/gtk/gtk/gtkscale.c (class docs, properties, key bindings, format_value)
|
|
34
|
+
// Copyright (c) GNOME contributors (libadwaita, GTK). LGPLv2.1+.
|
|
35
|
+
// Modifications: Implemented as a Web Component for @gjsify/adwaita-web; the range state
|
|
36
|
+
// composed from @gjsify/adwaita-core.
|
|
37
|
+
|
|
38
|
+
import {
|
|
39
|
+
SpinState,
|
|
40
|
+
glibClamp,
|
|
41
|
+
normalizeAdjustment,
|
|
42
|
+
normalizeBoxOrientation,
|
|
43
|
+
parseAdjustment,
|
|
44
|
+
} from '@gjsify/adwaita-core';
|
|
45
|
+
import type { AdwAdjustment, AdwAdjustmentInput, BoxOrientation } from '@gjsify/adwaita-core';
|
|
46
|
+
|
|
47
|
+
/** `Gtk.PositionType` nicks, as `GtkScale:value-pos` spells them. */
|
|
48
|
+
const VALUE_POSITIONS = ['left', 'right', 'top', 'bottom'] as const;
|
|
49
|
+
|
|
50
|
+
/** `GtkScale:value-pos` in the order libadwaita lays the value out: default `top`. */
|
|
51
|
+
type ValuePosition = (typeof VALUE_POSITIONS)[number];
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* `gtk_scale_init`'s `digits`, and the pspec default (gtkscale.c:705-708). `-1` on the
|
|
55
|
+
* pspec is the range floor, not a default: the default is 1.
|
|
56
|
+
*/
|
|
57
|
+
const SCALE_DEFAULT_DIGITS = 1;
|
|
58
|
+
|
|
59
|
+
/** `round-digits` — `gtk_scale_init` sets `-1`, which `gtk_range_set_round_digits` reads as "do not round". */
|
|
60
|
+
const NO_ROUNDING = -1;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The authored range with its authored value folded IN, which is what the C's constructor
|
|
64
|
+
* does with the two properties together and what a separate setter would not: configuring
|
|
65
|
+
* `value` after `adjustment` clamps it against the range it was authored beside, but it
|
|
66
|
+
* also notifies, and nothing has been built to notify yet.
|
|
67
|
+
*/
|
|
68
|
+
function seededRange(adjustment: string | null, value: string | null): AdwAdjustment {
|
|
69
|
+
const range = normalizeAdjustment(parseAdjustment(adjustment));
|
|
70
|
+
if (value === null) return range;
|
|
71
|
+
const authored = Number.parseFloat(value);
|
|
72
|
+
// A non-numeric `value` is not a placement, exactly as `SpinState.configure` says of its
|
|
73
|
+
// own: the value stays where the range put it.
|
|
74
|
+
return Number.isFinite(authored) ? { ...range, value: authored } : range;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* `gtk_scale_format_value`'s default arm plus `weed_out_neg_zero` (gtkscale.c:1230-1245).
|
|
79
|
+
*
|
|
80
|
+
* Exported for the widget's own spec; `<gtk-spin-button>` carries the SAME `g_strdup_printf
|
|
81
|
+
* ("%0.*f")` in its own C (`gtk_spin_button_format_for_value`, gtkspinbutton.c:1319-1326) with
|
|
82
|
+
* a different `digits` default, and reuses this rather than growing a second copy of it.
|
|
83
|
+
*/
|
|
84
|
+
export function formatScaleValue(value: number, digits: number): string {
|
|
85
|
+
const text = value.toFixed(digits);
|
|
86
|
+
// `-0.00` at two places IS `-0.00` in `toFixed`, and C's `weed_out_neg_zero` compares the
|
|
87
|
+
// formatted string against `g_snprintf ("%0.*f", digits, -0.0)` — so the minus goes
|
|
88
|
+
// exactly when the rounded value is a negative zero at that precision.
|
|
89
|
+
if (text.startsWith('-') && Number.parseFloat(text) === 0) return text.slice(1);
|
|
90
|
+
return text;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export class GtkScale extends HTMLElement {
|
|
94
|
+
/** The headless `Gtk.Adjustment`: the range, the clamp and the two signals (ADR 0004, ADR 0047). */
|
|
95
|
+
private readonly _range = new SpinState();
|
|
96
|
+
private _trough!: HTMLElement;
|
|
97
|
+
private _highlight!: HTMLElement;
|
|
98
|
+
private _fill!: HTMLElement;
|
|
99
|
+
private _slider!: HTMLElement;
|
|
100
|
+
private _value!: HTMLElement;
|
|
101
|
+
private _initialized = false;
|
|
102
|
+
private _pointerId: number | null = null;
|
|
103
|
+
|
|
104
|
+
static get observedAttributes() {
|
|
105
|
+
return [
|
|
106
|
+
'adjustment',
|
|
107
|
+
'digits',
|
|
108
|
+
'disabled',
|
|
109
|
+
'draw-value',
|
|
110
|
+
'fill-level',
|
|
111
|
+
'has-origin',
|
|
112
|
+
'inverted',
|
|
113
|
+
'orientation',
|
|
114
|
+
'restrict-to-fill-level',
|
|
115
|
+
'round-digits',
|
|
116
|
+
'show-fill-level',
|
|
117
|
+
'value',
|
|
118
|
+
'value-pos',
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** `GtkOrientable:orientation` — `horizontal` (the default) or `vertical`. */
|
|
123
|
+
get orientation(): BoxOrientation {
|
|
124
|
+
return normalizeBoxOrientation(this.getAttribute('orientation'));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
set orientation(value: BoxOrientation) {
|
|
128
|
+
this.setAttribute('orientation', value);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The numeric range — `Gtk.Range:adjustment`, as the portable value. Writes MERGE. */
|
|
132
|
+
get adjustment(): AdwAdjustment {
|
|
133
|
+
return this._range.adjustment;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
set adjustment(value: AdwAdjustmentInput | string) {
|
|
137
|
+
this._range.configure(typeof value === 'string' ? parseAdjustment(value) : value);
|
|
138
|
+
this._render();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** `Gtk.Range:value` — always inside `adjustmentRange`. */
|
|
142
|
+
get value(): number {
|
|
143
|
+
return this._range.value;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
set value(v: number) {
|
|
147
|
+
this._setValue(v, false);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** `Gtk.Range:inverted`. */
|
|
151
|
+
get inverted(): boolean {
|
|
152
|
+
return this.hasAttribute('inverted');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
set inverted(value: boolean) {
|
|
156
|
+
this.toggleAttribute('inverted', !!value);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** `GtkScale:draw-value` — whether the value is shown beside the slider. */
|
|
160
|
+
get drawValue(): boolean {
|
|
161
|
+
return this.hasAttribute('draw-value');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
set drawValue(value: boolean) {
|
|
165
|
+
this.toggleAttribute('draw-value', !!value);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** `GtkScale:value-pos` — `left`, `right`, `top` (the default) or `bottom`. */
|
|
169
|
+
get valuePos(): ValuePosition {
|
|
170
|
+
const declared = this.getAttribute('value-pos');
|
|
171
|
+
return VALUE_POSITIONS.includes(declared as ValuePosition) ? (declared as ValuePosition) : 'top';
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
set valuePos(value: ValuePosition) {
|
|
175
|
+
this.setAttribute('value-pos', value);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** `GtkScale:has-origin` — the default, so the highlight exists unless it is cleared. */
|
|
179
|
+
get hasOrigin(): boolean {
|
|
180
|
+
return !this.hasAttribute('has-origin') || this.getAttribute('has-origin') !== 'false';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
set hasOrigin(value: boolean) {
|
|
184
|
+
this.toggleAttribute('has-origin', !!value);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** `GtkScale:digits` — decimal places in the value text. */
|
|
188
|
+
get digits(): number {
|
|
189
|
+
const declared = Number.parseInt(this.getAttribute('digits') ?? '', 10);
|
|
190
|
+
return Number.isFinite(declared) ? Math.max(0, declared) : SCALE_DEFAULT_DIGITS;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
set digits(value: number) {
|
|
194
|
+
this.setAttribute('digits', String(value));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** `Gtk.Range:fill-level` — the buffer level a media player would draw. */
|
|
198
|
+
get fillLevel(): number {
|
|
199
|
+
const declared = Number.parseFloat(this.getAttribute('fill-level') ?? '');
|
|
200
|
+
return Number.isFinite(declared) ? declared : 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
set fillLevel(value: number) {
|
|
204
|
+
this.setAttribute('fill-level', String(value));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** `Gtk.Range:show-fill-level` — no property by default, as `gtk_range_init` leaves it. */
|
|
208
|
+
get showFillLevel(): boolean {
|
|
209
|
+
return this.hasAttribute('show-fill-level');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
set showFillLevel(value: boolean) {
|
|
213
|
+
this.toggleAttribute('show-fill-level', !!value);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** `Gtk.Range:restrict-to-fill-level`. */
|
|
217
|
+
get restrictToFillLevel(): boolean {
|
|
218
|
+
return this.hasAttribute('restrict-to-fill-level');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
set restrictToFillLevel(value: boolean) {
|
|
222
|
+
this.toggleAttribute('restrict-to-fill-level', !!value);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** The knob, for a consumer that needs to measure it (`coord_to_value` needs its length). */
|
|
226
|
+
get slider(): HTMLElement {
|
|
227
|
+
return this._slider;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
connectedCallback() {
|
|
231
|
+
if (this._initialized) return;
|
|
232
|
+
this._initialized = true;
|
|
233
|
+
|
|
234
|
+
// Seed the headless range BEFORE subscribing, so building the DOM below is not
|
|
235
|
+
// driven by a change notification. The authored `value` goes IN with the range and
|
|
236
|
+
// not through a setter after it: in C this is `priv->value` being initialised, and a
|
|
237
|
+
// setter would emit `value-changed` for a state the widget never had.
|
|
238
|
+
this._range.configure(seededRange(this.getAttribute('adjustment'), this.getAttribute('value')));
|
|
239
|
+
|
|
240
|
+
this._trough = document.createElement('span');
|
|
241
|
+
this._trough.className = 'adw-scale-trough';
|
|
242
|
+
this._highlight = document.createElement('span');
|
|
243
|
+
this._highlight.className = 'adw-scale-highlight';
|
|
244
|
+
this._fill = document.createElement('span');
|
|
245
|
+
this._fill.className = 'adw-scale-fill';
|
|
246
|
+
this._slider = document.createElement('span');
|
|
247
|
+
this._slider.className = 'adw-scale-slider';
|
|
248
|
+
this._trough.append(this._fill, this._highlight, this._slider);
|
|
249
|
+
|
|
250
|
+
this._value = document.createElement('span');
|
|
251
|
+
this._value.className = 'adw-scale-value';
|
|
252
|
+
|
|
253
|
+
this.replaceChildren(this._trough, this._value);
|
|
254
|
+
|
|
255
|
+
// `Gtk.AccessibleRole.slider` (gtkscale.c:143), and the range is focusable in C
|
|
256
|
+
// (`gtk_widget_set_focusable (…, TRUE)`, gtkscale.c:825) because it owns the keys.
|
|
257
|
+
this.setAttribute('role', 'slider');
|
|
258
|
+
if (!this.hasAttribute('tabindex')) this.setAttribute('tabindex', '0');
|
|
259
|
+
|
|
260
|
+
this._trough.addEventListener('pointerdown', (event) => this._onPointerDown(event));
|
|
261
|
+
this._value.addEventListener('pointerdown', (event) => this._onPointerDown(event));
|
|
262
|
+
this.addEventListener('keydown', (event) => this._onKeyDown(event));
|
|
263
|
+
this.addEventListener('pointermove', (event) => this._onPointerMove(event));
|
|
264
|
+
this.addEventListener('pointerup', (event) => this._onPointerUp(event));
|
|
265
|
+
this.addEventListener('pointercancel', (event) => this._onPointerUp(event));
|
|
266
|
+
|
|
267
|
+
this._range.subscribe((change) => {
|
|
268
|
+
this._render();
|
|
269
|
+
this.dispatchEvent(new CustomEvent('value-changed', { bubbles: true, detail: { value: change.value } }));
|
|
270
|
+
});
|
|
271
|
+
this._range.subscribeChanged(() => this._render());
|
|
272
|
+
|
|
273
|
+
this._render();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
attributeChangedCallback(name: string) {
|
|
277
|
+
if (!this._initialized) return;
|
|
278
|
+
if (name === 'adjustment') {
|
|
279
|
+
this._range.configure(parseAdjustment(this.getAttribute('adjustment')));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (name === 'value') {
|
|
283
|
+
this._range.setValue(Number.parseFloat(this.getAttribute('value') ?? '0'));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
this._render();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* `gtk_range_real_change_value`'s write, with the range's own clamp inside `SpinState`.
|
|
291
|
+
*
|
|
292
|
+
* `restrict-to-fill-level` and `round-digits` are `GtkRange`'s own two lines before the
|
|
293
|
+
* CLAMP (gtkrange.c:2873-2891), so they belong here rather than in the element's setter.
|
|
294
|
+
* `interactive` is what separates a drag from a programmatic write in `SpinState`.
|
|
295
|
+
*/
|
|
296
|
+
private _setValue(target: number, interactive: boolean): boolean {
|
|
297
|
+
let next = target;
|
|
298
|
+
if (this.restrictToFillLevel) next = Math.min(next, Math.max(this.adjustment.lower, this.fillLevel));
|
|
299
|
+
const digits = Number.parseInt(this.getAttribute('round-digits') ?? '', 10);
|
|
300
|
+
if (Number.isFinite(digits) && digits !== NO_ROUNDING) {
|
|
301
|
+
// `floor (value * power + 0.5) / power`, which rounds half UP — not `toFixed`,
|
|
302
|
+
// which rounds half away from zero and would differ on every negative half.
|
|
303
|
+
const power = 10 ** digits;
|
|
304
|
+
next = Math.floor(next * power + 0.5) / power;
|
|
305
|
+
}
|
|
306
|
+
return interactive ? this._range.setValueInteractive(next) : this._range.setValue(next);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* `coord_to_value` (gtkrange.c:1838-1878), which is `GtkScale`'s whole pointer mapping.
|
|
311
|
+
*
|
|
312
|
+
* A SCALE sets `slider_size_fixed`, so the fraction is `coord / trough_length` and the
|
|
313
|
+
* slider's own length does not shorten the track — the knob's CENTRE is the value. An
|
|
314
|
+
* equal-length degenerate trough answers 1.0, as C does.
|
|
315
|
+
*/
|
|
316
|
+
private _valueAtCoord(coord: number): number {
|
|
317
|
+
const adjustment = this.adjustment;
|
|
318
|
+
const troughLength = this.orientation === 'horizontal' ? this._trough.clientWidth : this._trough.clientHeight;
|
|
319
|
+
let frac = troughLength === 0 ? 1 : glibClamp(coord / troughLength, 0, 1);
|
|
320
|
+
if (this._shouldInvert()) frac = 1 - frac;
|
|
321
|
+
return adjustment.lower + frac * (adjustment.upper - adjustment.lower - adjustment.pageSize);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* `should_invert` (gtkrange.c:1806-1818) for a scale, which is always `flippable`
|
|
326
|
+
* (`gtk_scale_init`, gtkscale.c:838).
|
|
327
|
+
*
|
|
328
|
+
* A horizontal scale in a RIGHT-TO-LEFT document is the case the `flippable` flag
|
|
329
|
+
* exists for: `inverted` false already reads backwards there, so the two cancel and
|
|
330
|
+
* the fraction is used as it comes.
|
|
331
|
+
*/
|
|
332
|
+
private _shouldInvert(): boolean {
|
|
333
|
+
const rtl = this.closest('[dir="rtl"]') !== null;
|
|
334
|
+
if (this.orientation === 'horizontal') {
|
|
335
|
+
return this.inverted ? !rtl : rtl;
|
|
336
|
+
}
|
|
337
|
+
return this.inverted;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
private _onPointerDown(event: PointerEvent): void {
|
|
341
|
+
if (this.hasAttribute('disabled')) return;
|
|
342
|
+
// GTK refuses the grab on a trough press without a primary button (gtkrange.c:2088-2135).
|
|
343
|
+
if (event.button !== 0) return;
|
|
344
|
+
const rect = this._trough.getBoundingClientRect();
|
|
345
|
+
const coord = this.orientation === 'horizontal' ? event.clientX - rect.left : event.clientY - rect.top;
|
|
346
|
+
this._pointerId = event.pointerId;
|
|
347
|
+
this.focus();
|
|
348
|
+
this._setValue(this._valueAtCoord(coord), true);
|
|
349
|
+
// `setPointerCapture` THROWS `NotFoundError` for a pointerId with no active pointer,
|
|
350
|
+
// which is what a dispatched (not generated) event carries — so the value has moved
|
|
351
|
+
// first and the capture is best-effort.
|
|
352
|
+
try {
|
|
353
|
+
this.setPointerCapture(event.pointerId);
|
|
354
|
+
} catch {
|
|
355
|
+
// No active pointer to capture: the drag ends on the next `pointerup` anywhere.
|
|
356
|
+
}
|
|
357
|
+
event.preventDefault();
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
private _onPointerMove(event: PointerEvent): void {
|
|
361
|
+
if (this._pointerId !== event.pointerId) return;
|
|
362
|
+
const rect = this._trough.getBoundingClientRect();
|
|
363
|
+
const coord = this.orientation === 'horizontal' ? event.clientX - rect.left : event.clientY - rect.top;
|
|
364
|
+
this._setValue(this._valueAtCoord(coord), true);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private _onPointerUp(event: PointerEvent): void {
|
|
368
|
+
if (this._pointerId !== event.pointerId) return;
|
|
369
|
+
this._pointerId = null;
|
|
370
|
+
// `hasPointerCapture` is the guard that needs no exception: it answers FALSE for the
|
|
371
|
+
// pointerId the press never captured.
|
|
372
|
+
if (this.hasPointerCapture(event.pointerId)) this.releasePointerCapture(event.pointerId);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* The keys `GtkScale` binds (gtkscale.c:745-800), and none of them is orientation-bound:
|
|
377
|
+
* the C says so in its own comment, because a blind user should not have to know which
|
|
378
|
+
* way the slider runs.
|
|
379
|
+
*/
|
|
380
|
+
private _onKeyDown(event: KeyboardEvent): void {
|
|
381
|
+
if (this.hasAttribute('disabled')) return;
|
|
382
|
+
const adjustment = this.adjustment;
|
|
383
|
+
const page = event.ctrlKey;
|
|
384
|
+
let target: number | null = null;
|
|
385
|
+
switch (event.key) {
|
|
386
|
+
case 'ArrowLeft':
|
|
387
|
+
target = this.value - (page ? adjustment.pageIncrement : adjustment.stepIncrement);
|
|
388
|
+
break;
|
|
389
|
+
case 'ArrowRight':
|
|
390
|
+
target = this.value + (page ? adjustment.pageIncrement : adjustment.stepIncrement);
|
|
391
|
+
break;
|
|
392
|
+
case 'ArrowDown':
|
|
393
|
+
target = this.value - (page ? adjustment.pageIncrement : adjustment.stepIncrement);
|
|
394
|
+
break;
|
|
395
|
+
case 'ArrowUp':
|
|
396
|
+
target = this.value + (page ? adjustment.pageIncrement : adjustment.stepIncrement);
|
|
397
|
+
break;
|
|
398
|
+
case 'PageUp':
|
|
399
|
+
target = this.value + adjustment.pageIncrement;
|
|
400
|
+
break;
|
|
401
|
+
case 'PageDown':
|
|
402
|
+
target = this.value - adjustment.pageIncrement;
|
|
403
|
+
break;
|
|
404
|
+
case 'Home':
|
|
405
|
+
target = adjustment.lower;
|
|
406
|
+
break;
|
|
407
|
+
case 'End':
|
|
408
|
+
target = adjustment.upper - adjustment.pageSize;
|
|
409
|
+
break;
|
|
410
|
+
case '+':
|
|
411
|
+
case '=':
|
|
412
|
+
target = this.value + (page ? adjustment.pageIncrement : adjustment.stepIncrement);
|
|
413
|
+
break;
|
|
414
|
+
case '-':
|
|
415
|
+
target = this.value - (page ? adjustment.pageIncrement : adjustment.stepIncrement);
|
|
416
|
+
break;
|
|
417
|
+
default:
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
event.preventDefault();
|
|
421
|
+
this._setValue(target, true);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
private _render(): void {
|
|
425
|
+
if (!this._trough) return;
|
|
426
|
+
const orientation = this.orientation;
|
|
427
|
+
const adjustment = this.adjustment;
|
|
428
|
+
// The knob's CENTRE is the value, because a scale's slider size is fixed
|
|
429
|
+
// (`gtk_scale_init`, gtkscale.c:832) and `coord_to_value` divides by the trough alone.
|
|
430
|
+
const span = adjustment.upper - adjustment.lower - adjustment.pageSize;
|
|
431
|
+
const raw = span === 0 ? 0 : (adjustment.value - adjustment.lower) / span;
|
|
432
|
+
const fraction = glibClamp(this._shouldInvert() ? 1 - raw : raw, 0, 1);
|
|
433
|
+
|
|
434
|
+
this.classList.toggle('horizontal', orientation === 'horizontal');
|
|
435
|
+
this.classList.toggle('vertical', orientation === 'vertical');
|
|
436
|
+
this.setAttribute('aria-orientation', orientation);
|
|
437
|
+
if (orientation === 'horizontal') this._slider.style.left = `${fraction * 100}%`;
|
|
438
|
+
else this._slider.style.bottom = `${fraction * 100}%`;
|
|
439
|
+
this._slider.style.top = '';
|
|
440
|
+
this._slider.style.right = '';
|
|
441
|
+
|
|
442
|
+
const origin = this.hasOrigin;
|
|
443
|
+
this._highlight.hidden = !origin;
|
|
444
|
+
if (origin) {
|
|
445
|
+
if (orientation === 'horizontal') {
|
|
446
|
+
this._highlight.style.right = '';
|
|
447
|
+
this._highlight.style.width = `${fraction * 100}%`;
|
|
448
|
+
} else {
|
|
449
|
+
this._highlight.style.width = '';
|
|
450
|
+
this._highlight.style.height = `${fraction * 100}%`;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// `> fill` is a SECOND trough-styled bar, for a media player's buffered range
|
|
455
|
+
// (`_scale.scss:43-47`) — not the highlighted part the `has-origin` block owns.
|
|
456
|
+
const filled = this.showFillLevel;
|
|
457
|
+
this._fill.hidden = !filled;
|
|
458
|
+
if (filled) {
|
|
459
|
+
const level = glibClamp((this.fillLevel - adjustment.lower) / (span || 1), 0, 1);
|
|
460
|
+
if (orientation === 'horizontal') this._fill.style.width = `${level * 100}%`;
|
|
461
|
+
else this._fill.style.height = `${level * 100}%`;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
this._value.textContent = formatScaleValue(adjustment.value, this.digits);
|
|
465
|
+
this._value.hidden = !this.drawValue;
|
|
466
|
+
const position = this.valuePos;
|
|
467
|
+
this._value.classList.toggle('left', position === 'left');
|
|
468
|
+
this._value.classList.toggle('right', position === 'right');
|
|
469
|
+
this._value.classList.toggle('top', position === 'top');
|
|
470
|
+
this._value.classList.toggle('bottom', position === 'bottom');
|
|
471
|
+
// `update_value_position` (gtkscale.c:1042-1073) puts the position class on the
|
|
472
|
+
// VALUE NODE, and there the four rules are all it needs: `left`/`right` add a
|
|
473
|
+
// margin and `top`/`bottom` another. The AXIS the two nodes sit on cannot come from
|
|
474
|
+
// there — `gtk_scale_allocate` (gtkscale.c:373-421) allocates the value at one EDGE
|
|
475
|
+
// of the widget, which for `top`/`bottom` is a different line from the trough's and
|
|
476
|
+
// for `left`/`right` the same one — so the same four names go on the HOST, where a
|
|
477
|
+
// `flex-direction` is all that switch needs.
|
|
478
|
+
this.classList.toggle('value-top', position === 'top');
|
|
479
|
+
this.classList.toggle('value-right', position === 'right');
|
|
480
|
+
this.classList.toggle('value-bottom', position === 'bottom');
|
|
481
|
+
this.classList.toggle('value-left', position === 'left');
|
|
482
|
+
|
|
483
|
+
this.setAttribute('aria-valuemin', String(adjustment.lower));
|
|
484
|
+
this.setAttribute('aria-valuemax', String(adjustment.upper - adjustment.pageSize));
|
|
485
|
+
this.setAttribute('aria-valuenow', String(adjustment.value));
|
|
486
|
+
this.setAttribute('aria-valuetext', this._value.textContent ?? '');
|
|
487
|
+
if (this.hasAttribute('disabled')) this.setAttribute('aria-disabled', 'true');
|
|
488
|
+
else this.removeAttribute('aria-disabled');
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
customElements.define('gtk-scale', GtkScale);
|