@gjsify/adwaita-web 0.45.0 → 0.46.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 -6
- package/dist/adwaita-web.css +96 -96
- package/dist/adwaita-web.css.map +1 -1
- package/lib/types/elements/adw-entry-row.d.ts +2 -2
- package/lib/types/elements/adw-expander-row.d.ts +1 -1
- package/lib/types/elements/adw-split-button.d.ts +1 -1
- package/lib/types/elements/adw-switch-row.d.ts +1 -1
- package/lib/types/elements/adw-wrap-box.d.ts +1 -1
- package/lib/types/elements/{adw-checks.d.ts → checks.d.ts} +9 -2
- package/lib/types/elements/{adw-button.d.ts → gtk-button.d.ts} +1 -1
- package/lib/types/elements/{adw-drop-down.d.ts → gtk-drop-down.d.ts} +6 -6
- package/lib/types/elements/{adw-entry.d.ts → gtk-entry.d.ts} +1 -1
- package/lib/types/elements/{adw-icon.d.ts → gtk-image.d.ts} +2 -2
- package/lib/types/elements/{adw-menu-button.d.ts → gtk-menu-button.d.ts} +13 -4
- package/lib/types/elements/{adw-popover.d.ts → gtk-popover.d.ts} +9 -9
- package/lib/types/elements/{adw-progress-bar.d.ts → gtk-progress-bar.d.ts} +1 -1
- package/lib/types/elements/{adw-switch.d.ts → gtk-switch.d.ts} +2 -2
- package/lib/types/elements/view-switcher-dom.d.ts +4 -4
- package/lib/types/exported-elements.d.ts +10 -0
- package/lib/types/gtk-button.spec.d.ts +1 -0
- package/lib/types/gtk-drop-down.spec.d.ts +1 -0
- package/lib/types/gtk-entry.spec.d.ts +1 -0
- package/lib/types/gtk-image.spec.d.ts +1 -0
- package/lib/types/gtk-menu-button.spec.d.ts +1 -0
- package/lib/types/gtk-progress-bar.spec.d.ts +1 -0
- package/lib/types/gtk-switch.spec.d.ts +1 -0
- package/lib/types/icon-registry.d.ts +2 -2
- package/lib/types/index.d.ts +13 -51
- package/lib/types/namespace/adw.d.ts +44 -0
- package/lib/types/namespace/gtk.d.ts +9 -0
- package/lib/types/styles.generated.d.ts +1 -1
- package/package.json +6 -6
- package/scss/_about_dialog.scss +1 -1
- package/scss/_button.scss +4 -4
- package/scss/_checks.scss +6 -6
- package/scss/_drop_down.scss +3 -3
- package/scss/_entry.scss +3 -3
- package/scss/_expander_row.scss +1 -1
- package/scss/_icon.scss +4 -4
- package/scss/_menu_button.scss +3 -3
- package/scss/_popover.scss +2 -2
- package/scss/_progress_bar.scss +4 -4
- package/scss/_reset.scss +10 -8
- package/scss/_split_button.scss +1 -1
- package/scss/_style_classes.scss +9 -9
- package/scss/_switch.scss +2 -2
- package/scss/_switch_row.scss +1 -1
- package/scss/_toast.scss +1 -1
- package/scss/adwaita-skin.scss +2 -2
- package/src/adw-action-rows.spec.ts +2 -2
- package/src/adw-button-content.spec.ts +1 -1
- package/src/bottom-sheet.spec.ts +2 -2
- package/src/{adw-checks.spec.ts → checks.spec.ts} +11 -11
- package/src/chrome.spec.ts +2 -2
- package/src/connect-lifecycle.spec.ts +10 -7
- package/src/elements/adw-about-dialog.ts +6 -6
- package/src/elements/adw-avatar.ts +4 -4
- package/src/elements/adw-button-content.ts +6 -6
- package/src/elements/adw-button-row.ts +6 -6
- package/src/elements/adw-combo-row.ts +1 -1
- package/src/elements/adw-entry-row.ts +5 -5
- package/src/elements/adw-expander-row.ts +10 -10
- package/src/elements/adw-navigation-view.ts +1 -1
- package/src/elements/adw-password-entry-row.ts +3 -3
- package/src/elements/adw-sidebar.ts +4 -4
- package/src/elements/adw-split-button.ts +14 -14
- package/src/elements/adw-status-page.ts +4 -4
- package/src/elements/adw-switch-row.ts +8 -8
- package/src/elements/adw-tab-view.ts +7 -7
- package/src/elements/adw-toast-overlay.ts +2 -2
- package/src/elements/adw-toggle-group.ts +3 -3
- package/src/elements/adw-view-switcher-bar.ts +3 -3
- package/src/elements/adw-view-switcher.ts +3 -3
- package/src/elements/{adw-checks.ts → checks.ts} +13 -6
- package/src/elements/{adw-button.ts → gtk-button.ts} +6 -6
- package/src/elements/{adw-drop-down.ts → gtk-drop-down.ts} +18 -18
- package/src/elements/{adw-entry.ts → gtk-entry.ts} +4 -4
- package/src/elements/{adw-icon.ts → gtk-image.ts} +5 -5
- package/src/elements/{adw-menu-button.ts → gtk-menu-button.ts} +27 -18
- package/src/elements/{adw-popover.ts → gtk-popover.ts} +18 -18
- package/src/elements/{adw-progress-bar.ts → gtk-progress-bar.ts} +5 -5
- package/src/elements/{adw-switch.ts → gtk-switch.ts} +4 -4
- package/src/elements/view-switcher-dom.ts +5 -5
- package/src/exported-elements.ts +50 -0
- package/src/{adw-button.spec.ts → gtk-button.spec.ts} +6 -6
- package/src/{adw-drop-down.spec.ts → gtk-drop-down.spec.ts} +17 -17
- package/src/{adw-entry.spec.ts → gtk-entry.spec.ts} +8 -8
- package/src/{adw-icon.spec.ts → gtk-image.spec.ts} +21 -21
- package/src/{adw-menu-button.spec.ts → gtk-menu-button.spec.ts} +6 -6
- package/src/{adw-progress-bar.spec.ts → gtk-progress-bar.spec.ts} +12 -12
- package/src/{adw-switch.spec.ts → gtk-switch.spec.ts} +20 -20
- package/src/icon-registry.spec.ts +6 -6
- package/src/icon-registry.ts +6 -6
- package/src/index.ts +64 -63
- package/src/namespace/adw.ts +99 -0
- package/src/namespace/gtk.ts +22 -0
- package/src/preferences-search.ts +1 -1
- package/src/slotted-children.spec.ts +5 -3
- package/src/source-view/adw-source-view.ts +2 -2
- package/src/split-button.spec.ts +5 -5
- package/src/styles.generated.ts +1 -1
- package/src/test.browser.mts +15 -15
- package/lib/types/adw-button.spec.d.ts +0 -1
- package/lib/types/adw-drop-down.spec.d.ts +0 -1
- package/lib/types/adw-entry.spec.d.ts +0 -1
- package/lib/types/adw-icon.spec.d.ts +0 -1
- package/lib/types/adw-menu-button.spec.d.ts +0 -1
- package/lib/types/adw-progress-bar.spec.d.ts +0 -1
- package/lib/types/adw-switch.spec.d.ts +0 -1
- /package/lib/types/{adw-checks.spec.d.ts → checks.spec.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/adwaita-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"description": "Adwaita/Libadwaita web components for browser targets",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
"@codemirror/language": "^6.12.4",
|
|
46
46
|
"@codemirror/state": "^6.7.0",
|
|
47
47
|
"@codemirror/view": "^6.43.4",
|
|
48
|
-
"@gjsify/adwaita-core": "^0.
|
|
49
|
-
"@gjsify/adwaita-fonts": "^0.
|
|
50
|
-
"@gjsify/adwaita-icons": "^0.
|
|
48
|
+
"@gjsify/adwaita-core": "^0.46.0",
|
|
49
|
+
"@gjsify/adwaita-fonts": "^0.46.0",
|
|
50
|
+
"@gjsify/adwaita-icons": "^0.46.0",
|
|
51
51
|
"@lezer/highlight": "^1.2.3"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@gjsify/cli": "^0.
|
|
55
|
-
"@gjsify/unit": "^0.
|
|
54
|
+
"@gjsify/cli": "^0.46.0",
|
|
55
|
+
"@gjsify/unit": "^0.46.0",
|
|
56
56
|
"sass": "^1.101.0",
|
|
57
57
|
"typescript": "^6.0.3"
|
|
58
58
|
},
|
package/scss/_about_dialog.scss
CHANGED
|
@@ -149,7 +149,7 @@ adw-about-dialog {
|
|
|
149
149
|
height: 96px;
|
|
150
150
|
margin-top: var(--spacing-s);
|
|
151
151
|
margin-bottom: var(--spacing-m);
|
|
152
|
-
// Mask-driven adw-icon scaled up to the about-dialog app-icon size.
|
|
152
|
+
// Mask-driven .adw-icon skin scaled up to the about-dialog app-icon size.
|
|
153
153
|
-webkit-mask-size: contain;
|
|
154
154
|
mask-size: contain;
|
|
155
155
|
background-color: currentColor;
|
package/scss/_button.scss
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// _button.scss —
|
|
1
|
+
// _button.scss — gtk-button + Adwaita button styles + symbolic icons + .linked.
|
|
2
2
|
// Reference: refs/libadwaita/src/stylesheet/widgets/_buttons.scss
|
|
3
3
|
// Copyright (c) GNOME contributors (libadwaita). LGPLv2.1+.
|
|
4
4
|
// Modifications: Adapted for @gjsify/adwaita-web Web Components.
|
|
5
5
|
|
|
6
|
-
// <
|
|
6
|
+
// <gtk-button> is a thin host that renders an inner <button class="adw-button">;
|
|
7
7
|
// the class set is the real styling API and works on a plain <button> too.
|
|
8
|
-
|
|
8
|
+
gtk-button {
|
|
9
9
|
display: inline-flex;
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -159,7 +159,7 @@ adw-button {
|
|
|
159
159
|
|
|
160
160
|
// The symbolic icon (`.adw-icon`) used to be declared here, because the first
|
|
161
161
|
// widget that needed one was the button. It is `scss/_icon.scss` now — every
|
|
162
|
-
// other widget needs one too, and `<
|
|
162
|
+
// other widget needs one too, and `<gtk-image>` is an element.
|
|
163
163
|
|
|
164
164
|
// The linked group is `scss/_style_classes.scss` now, under libadwaita's own
|
|
165
165
|
// `.linked` name (with `.adw-linked` kept as an alias): the documented class is
|
package/scss/_checks.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// _checks.scss — <
|
|
1
|
+
// _checks.scss — <gtk-check-button> AND <adw-radio>, in ONE partial.
|
|
2
2
|
//
|
|
3
3
|
// WHY ONE FILE FOR TWO ELEMENTS. Upstream's
|
|
4
4
|
// `refs/libadwaita/src/stylesheet/widgets/_checks.scss` merges them deliberately:
|
|
@@ -51,7 +51,7 @@ $bullet-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'
|
|
|
51
51
|
$dash-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14'%3E%3Cpath fill='black' d='M 3 5 A 2 2 0 0 0 1 7 A 2 2 0 0 0 3 9 L 11 9 A 2 2 0 0 0 13 7 A 2 2 0 0 0 11 5 Z'/%3E%3C/svg%3E");
|
|
52
52
|
|
|
53
53
|
// `checkbutton { … }` (:3-18) — the host is the button, not the indicator.
|
|
54
|
-
|
|
54
|
+
gtk-check-button,
|
|
55
55
|
adw-radio {
|
|
56
56
|
position: relative;
|
|
57
57
|
display: inline-flex;
|
|
@@ -176,7 +176,7 @@ adw-radio {
|
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
// `check { border-radius: $check_radius }` (:67-68)
|
|
179
|
-
|
|
179
|
+
gtk-check-button .adw-check-indicator {
|
|
180
180
|
border-radius: 6px;
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -186,7 +186,7 @@ adw-radio .adw-check-indicator {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
// `check:checked` → check.svg (:70) / `radio:checked` → bullet.svg (:76)
|
|
189
|
-
|
|
189
|
+
gtk-check-button[checked] .adw-check-indicator::after {
|
|
190
190
|
mask-image: $check-glyph;
|
|
191
191
|
-webkit-mask-image: $check-glyph;
|
|
192
192
|
}
|
|
@@ -201,7 +201,7 @@ adw-radio[checked] .adw-check-indicator::after {
|
|
|
201
201
|
// wins over the check/bullet on a control that is both. Same order, same
|
|
202
202
|
// specificity, same outcome here — and the same precedence `resolveCheckState`
|
|
203
203
|
// in `@gjsify/adwaita-core` encodes for the a11y value.
|
|
204
|
-
|
|
204
|
+
gtk-check-button[indeterminate] .adw-check-indicator::after,
|
|
205
205
|
adw-radio[indeterminate] .adw-check-indicator::after {
|
|
206
206
|
mask-image: $dash-glyph;
|
|
207
207
|
-webkit-mask-image: $dash-glyph;
|
|
@@ -209,7 +209,7 @@ adw-radio[indeterminate] .adw-check-indicator::after {
|
|
|
209
209
|
|
|
210
210
|
// `checkbutton.selection-mode { … }` (:83-95) — the big round check used in a
|
|
211
211
|
// selection-mode header bar.
|
|
212
|
-
|
|
212
|
+
gtk-check-button.selection-mode,
|
|
213
213
|
adw-radio.selection-mode {
|
|
214
214
|
border-radius: 100px;
|
|
215
215
|
|
package/scss/_drop_down.scss
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// _drop_down.scss —
|
|
1
|
+
// _drop_down.scss — gtk-drop-down: a standalone dropdown selector (the web
|
|
2
2
|
// counterpart of Gtk.DropDown). A normal Adwaita button showing the current
|
|
3
3
|
// selection + a `pan-down` chevron, dropping an elevated Adwaita popover list of
|
|
4
4
|
// options. The popover reproduces libadwaita's popover.menu > contents surface
|
|
5
|
-
// (soft triple shadow), the items its modelbutton rows, matching <
|
|
5
|
+
// (soft triple shadow), the items its modelbutton rows, matching <gtk-menu-button>.
|
|
6
6
|
// Reference: refs/libadwaita/src/stylesheet/widgets/_popovers.scss (popover > contents)
|
|
7
7
|
// Reference: refs/libadwaita/src/stylesheet/widgets/_menus.scss (modelbutton rows)
|
|
8
8
|
// Reference: refs/libadwaita/src/stylesheet/widgets/_dropdowns.scss (dropdown button)
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
opacity: 0.55;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
// The popover SURFACE is `<
|
|
79
|
+
// The popover SURFACE is `<gtk-popover>`'s (`_popover.scss`, the `[menu]`
|
|
80
80
|
// variant — a dropdown's popover is a `popover.menu`, _dropdowns.scss:22).
|
|
81
81
|
// What stays here is what libadwaita ALSO scopes to `dropdown`:
|
|
82
82
|
// - the extra 6px above the contents (`popover.menu { padding-top: 6px }`,
|
package/scss/_entry.scss
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// _entry.scss —
|
|
1
|
+
// _entry.scss — gtk-entry / .adw-entry text input (e.g. a browser URL bar).
|
|
2
2
|
// Reference: refs/libadwaita/src/stylesheet/widgets/_entries.scss
|
|
3
3
|
// Copyright (c) GNOME contributors (libadwaita). LGPLv2.1+.
|
|
4
4
|
// Modifications: Adapted for @gjsify/adwaita-web Web Components.
|
|
5
5
|
|
|
6
|
-
// <
|
|
7
|
-
|
|
6
|
+
// <gtk-entry> hosts an inner <input class="adw-entry">; it fills its flex slot.
|
|
7
|
+
gtk-entry {
|
|
8
8
|
display: flex;
|
|
9
9
|
flex: 1;
|
|
10
10
|
min-width: 0;
|
package/scss/_expander_row.scss
CHANGED
|
@@ -69,7 +69,7 @@ adw-expander-row {
|
|
|
69
69
|
transform: rotate(180deg);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
// The optional enable switch is `<
|
|
72
|
+
// The optional enable switch is `<gtk-switch>` and needs no geometry of its
|
|
73
73
|
// own — `.adw-expander-row-enable-switch` is a query/override hook only. This
|
|
74
74
|
// block used to be a character-for-character copy of the switch row's toggle
|
|
75
75
|
// (44×24 box, hidden input, 20px knob, translateX(20px), focus ring), because
|
package/scss/_icon.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// _icon.scss — the symbolic icon box behind <
|
|
1
|
+
// _icon.scss — the symbolic icon box behind <gtk-image>.
|
|
2
2
|
//
|
|
3
3
|
// A symbolic icon is rendered as a CSS mask rather than an <img> or inline SVG,
|
|
4
4
|
// so `currentColor` drives the fill and the glyph re-themes with whatever
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
// `currentColor` IS the icon: the mask is painted with the inherited colour,
|
|
38
38
|
// so a suggested-action button's `--accent-fg-color` has to reach it. Since
|
|
39
|
-
// <
|
|
39
|
+
// <gtk-image> is a custom element it is also in `$adw-components`, and the
|
|
40
40
|
// ADR-0010 boundary reset re-roots `color` on every entry there — which would
|
|
41
41
|
// otherwise repaint every icon in `--window-fg-color` regardless of its host.
|
|
42
42
|
// Class beats type selector, so this restores inheritance.
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
// adw-inline-view-switcher.c:142), and GTK's icon theme returns the same
|
|
67
67
|
// broken-image paintable for a name it cannot find. So the three renderers end
|
|
68
68
|
// up on ONE glyph: GTK draws it from the system theme, the web draws it from
|
|
69
|
-
// here, and NativeScript cannot reach the state at all — its
|
|
69
|
+
// here, and NativeScript cannot reach the state at all — its GtkImage takes SVG
|
|
70
70
|
// SOURCE, not a name, so a missing icon there is a missing import the compiler
|
|
71
71
|
// rejects. Nothing THROWS, on any of the three: an icon is decorative and taking
|
|
72
72
|
// an application down over a glyph is a failure mode none of them has.
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
-webkit-mask-image: var(--icon-image-missing);
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
// …and NO name at all draws nothing, rather than the broken glyph. `<
|
|
85
|
+
// …and NO name at all draws nothing, rather than the broken glyph. `<gtk-image>`
|
|
86
86
|
// leaves the node classless only when `icon-name` is ABSENT or EMPTY, which is the
|
|
87
87
|
// state where the HOST decided against an icon — the tab strip's indicator slot,
|
|
88
88
|
// the avatar's fallback while initials show. `Gtk.Image` with a NULL icon-name
|
package/scss/_menu_button.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// _menu_button.scss —
|
|
1
|
+
// _menu_button.scss — gtk-menu-button styling: a flat (or circular) icon button
|
|
2
2
|
// that drops an Adwaita-styled popover menu (the web counterpart of
|
|
3
3
|
// Adw.MenuButton / Gtk.MenuButton). The button mirrors libadwaita's flat/circular
|
|
4
4
|
// `menubutton > button`; the popover reproduces `popover.menu > contents` with
|
|
@@ -77,8 +77,8 @@
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
// The surface, the heading and the item row are `<
|
|
81
|
-
// `_popover.scss` (`
|
|
80
|
+
// The surface, the heading and the item row are `<gtk-popover>`'s —
|
|
81
|
+
// `_popover.scss` (`gtk-popover`, `.adw-popover-title`, `.adw-popover-item`).
|
|
82
82
|
// What used to be here was one of three hand-rolled copies: a
|
|
83
83
|
// `--card-radius` (12px) surface where libadwaita's is 15px, and a
|
|
84
84
|
// `calc(var(--button-radius) - 2px)` (7px) row where `modelbutton` is 9px.
|
package/scss/_popover.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// _popover.scss — <
|
|
1
|
+
// _popover.scss — <gtk-popover>, the one popover surface in this package.
|
|
2
2
|
//
|
|
3
3
|
// It replaces three hand-rolled copies (`.adw-menu-button-popover`,
|
|
4
4
|
// `.adw-drop-down-popover`, `.adw-split-button-menu`) that disagreed with
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
// drop-down already used; the split button's 4px was the odd one out.
|
|
39
39
|
$popover-gap: 6px;
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
gtk-popover {
|
|
42
42
|
// $popover_radius = $menu_radius + 6 (_common.scss:10,13). Exposed as a token
|
|
43
43
|
// so consumers re-theme it the same way as the rest (ADR 0010), with the
|
|
44
44
|
// libadwaita value as the fallback.
|
package/scss/_progress_bar.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// _progress_bar.scss — <
|
|
1
|
+
// _progress_bar.scss — <gtk-progress-bar>, the determinate partner to
|
|
2
2
|
// <adw-spinner>.
|
|
3
3
|
//
|
|
4
4
|
// TWO SOURCES, AND WHICH HALF CAME FROM WHICH — the two disagree, so this is not
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
//
|
|
25
25
|
// NOT PORTED, deliberately: `progressbar.vertical` (:10-15) and the four
|
|
26
26
|
// `progress.{left,right,top,bottom}` corner-radius rules (:37-55). Both exist
|
|
27
|
-
// for orientations and trough-splitting `<
|
|
27
|
+
// for orientations and trough-splitting `<gtk-progress-bar>` does not expose —
|
|
28
28
|
// there is no `orientation` attribute — and a rule nothing can ever select is a
|
|
29
29
|
// rule that rots.
|
|
30
30
|
//
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
// `.dimmed` / `.numeric`, which the text node @extends exactly as upstream does.
|
|
40
40
|
@use 'labels';
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
gtk-progress-bar {
|
|
43
43
|
display: flex;
|
|
44
44
|
flex-direction: column;
|
|
45
45
|
gap: var(--spacing-xs);
|
|
@@ -104,7 +104,7 @@ adw-progress-bar {
|
|
|
104
104
|
// The `.osd` variant (:59-83): a hairline bar with no trough at all, the way
|
|
105
105
|
// it is drawn under a header bar. `[osd]` is the attribute this element takes;
|
|
106
106
|
// `.osd` is libadwaita's DOCUMENTED spelling for the same variant, and
|
|
107
|
-
// `_style_classes.scss` excludes `
|
|
107
|
+
// `_style_classes.scss` excludes `gtk-progress-bar` from the generic OSD
|
|
108
108
|
// surface exactly so the class lands here instead of turning the bar into a
|
|
109
109
|
// dark translucent box.
|
|
110
110
|
&[osd],
|
package/scss/_reset.scss
CHANGED
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
// neutralises.
|
|
19
19
|
|
|
20
20
|
// Every custom element adwaita-web defines — one entry per `customElements
|
|
21
|
-
// .define(
|
|
21
|
+
// .define(…)` call under `src/`, in BOTH namespaces: a tag carries the prefix of
|
|
22
|
+
// the library that owns its GType (ADR 0034 clause 1), so `gtk-entry` is on this
|
|
23
|
+
// list beside `adw-action-row`.
|
|
22
24
|
//
|
|
23
25
|
// DERIVED, NOT REMEMBERED: `scripts/check-adwaita-reset-components.mjs` walks
|
|
24
26
|
// those calls and fails on any tag missing from this list (and on any entry with
|
|
@@ -29,19 +31,19 @@
|
|
|
29
31
|
$adw-components:
|
|
30
32
|
adw-about-dialog, adw-action-row, adw-alert-dialog, adw-alert-response,
|
|
31
33
|
adw-avatar, adw-banner, adw-bottom-sheet, adw-bottom-sheet-content,
|
|
32
|
-
adw-bottom-sheet-sheet,
|
|
34
|
+
adw-bottom-sheet-sheet, gtk-button, adw-button-content, adw-button-row,
|
|
33
35
|
adw-card, adw-carousel, adw-carousel-indicator-dots,
|
|
34
|
-
adw-carousel-indicator-lines,
|
|
36
|
+
adw-carousel-indicator-lines, gtk-check-button, adw-clamp, adw-combo-row,
|
|
35
37
|
adw-data-grid,
|
|
36
|
-
adw-dialog,
|
|
37
|
-
adw-header-bar,
|
|
38
|
+
adw-dialog, gtk-drop-down, gtk-entry, adw-entry-row, adw-expander-row,
|
|
39
|
+
adw-header-bar, gtk-image, adw-inline-view-switcher, gtk-menu-button,
|
|
38
40
|
adw-navigation-page,
|
|
39
41
|
adw-navigation-split-view, adw-navigation-view, adw-overlay-split-view,
|
|
40
|
-
adw-password-entry-row,
|
|
41
|
-
adw-preferences-group, adw-preferences-page,
|
|
42
|
+
adw-password-entry-row, gtk-popover, adw-preferences-dialog,
|
|
43
|
+
adw-preferences-group, adw-preferences-page, gtk-progress-bar, adw-radio,
|
|
42
44
|
adw-shortcut-label, adw-sidebar, adw-sidebar-item,
|
|
43
45
|
adw-sidebar-section, adw-source-view, adw-spinner, adw-spin-row,
|
|
44
|
-
adw-split-button, adw-status-page,
|
|
46
|
+
adw-split-button, adw-status-page, gtk-switch, adw-switch-row,
|
|
45
47
|
adw-tab-page, adw-tab-view, adw-toast-overlay, adw-toggle, adw-toggle-group,
|
|
46
48
|
adw-toolbar-view, adw-view-stack, adw-view-stack-page, adw-view-switcher,
|
|
47
49
|
adw-view-switcher-bar, adw-view-switcher-page, adw-window, adw-window-title,
|
package/scss/_split_button.scss
CHANGED
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
// The dropdown menu is `<
|
|
114
|
+
// The dropdown menu is `<gtk-popover>` (`_popover.scss`), and this was the
|
|
115
115
|
// WORST of the three hand-rolled surfaces: `--button-radius` (9px) where
|
|
116
116
|
// libadwaita's popover is 15px, under a two-layer shadow that exists nowhere
|
|
117
117
|
// in the vendored stylesheet (`popover > contents` has three,
|
package/scss/_style_classes.scss
CHANGED
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
// split buttons go flat — unless they are `.raised`, `.suggested-action`,
|
|
187
187
|
// `.destructive-action`, `.opaque`, or sit inside a `.linked` group. Text-only
|
|
188
188
|
// buttons keep their frame, which is why this cannot be a blanket
|
|
189
|
-
// `.toolbar
|
|
189
|
+
// `.toolbar gtk-button { … }`.
|
|
190
190
|
$_keeps-frame: ':not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque)';
|
|
191
191
|
|
|
192
192
|
.toolbar {
|
|
@@ -195,9 +195,9 @@ $_keeps-frame: ':not(.raised):not(.suggested-action):not(.destructive-action):no
|
|
|
195
195
|
gap: 6px;
|
|
196
196
|
padding: 6px;
|
|
197
197
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
gtk-button#{$_keeps-frame} .adw-button.icon-only,
|
|
199
|
+
gtk-button#{$_keeps-frame}:has(adw-button-content) .adw-button,
|
|
200
|
+
gtk-menu-button#{$_keeps-frame} .adw-button,
|
|
201
201
|
adw-split-button#{$_keeps-frame} .adw-button {
|
|
202
202
|
background-color: transparent;
|
|
203
203
|
|
|
@@ -215,8 +215,8 @@ $_keeps-frame: ':not(.raised):not(.suggested-action):not(.destructive-action):no
|
|
|
215
215
|
// group only reads as one control if its members are raised.
|
|
216
216
|
.linked,
|
|
217
217
|
.adw-linked {
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
gtk-button#{$_keeps-frame} .adw-button,
|
|
219
|
+
gtk-menu-button#{$_keeps-frame} .adw-button,
|
|
220
220
|
adw-split-button#{$_keeps-frame} .adw-button {
|
|
221
221
|
background-color: var(--button-bg-color);
|
|
222
222
|
|
|
@@ -265,7 +265,7 @@ $_keeps-frame: ':not(.raised):not(.suggested-action):not(.destructive-action):no
|
|
|
265
265
|
//
|
|
266
266
|
// This is a token REBIND, not just a colour: everything accent-coloured inside
|
|
267
267
|
// an OSD surface turns white without knowing it is inside one.
|
|
268
|
-
.osd:not(
|
|
268
|
+
.osd:not(gtk-progress-bar):not(gtk-button):not(gtk-menu-button):not(adw-split-button):not(
|
|
269
269
|
adw-inline-view-switcher
|
|
270
270
|
) {
|
|
271
271
|
--accent-bg-color: rgb(255 255 255 / 75%);
|
|
@@ -295,8 +295,8 @@ $_keeps-frame: ':not(.raised):not(.suggested-action):not(.destructive-action):no
|
|
|
295
295
|
// it USED to add a 2px gap between children, which is a segmented look, not a
|
|
296
296
|
// linked one. The gap is gone; a consumer who wanted it can say `gap`.
|
|
297
297
|
// The styled node is either the child itself (a bare `.adw-button` /
|
|
298
|
-
// `.adw-entry`) or one rendered inside the child host element (`<
|
|
299
|
-
// `<
|
|
298
|
+
// `.adw-entry`) or one rendered inside the child host element (`<gtk-button>`,
|
|
299
|
+
// `<gtk-menu-button>`, `<gtk-drop-down>`, …) — so both spellings are matched
|
|
300
300
|
// rather than enumerating host tags the way GTK has to.
|
|
301
301
|
$_linked-nodes: '.adw-button', '.adw-entry';
|
|
302
302
|
|
package/scss/_switch.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// _switch.scss — the <
|
|
1
|
+
// _switch.scss — the <gtk-switch> control: a track, a hidden checkbox and a
|
|
2
2
|
// sliding knob. UNSCOPED, which is the whole point of the partial.
|
|
3
3
|
//
|
|
4
4
|
// WHY IT IS ITS OWN FILE. These rules used to live inside `_switch_row.scss`,
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
// Copyright (c) GNOME contributors (libadwaita). LGPLv2.1+.
|
|
25
25
|
// Copyright (c) 2025 csm (adwaita-web). MIT License.
|
|
26
26
|
// Modifications: Adapted for @gjsify/adwaita-web Web Components; lifted out of
|
|
27
|
-
// `adw-switch-row {}` so <
|
|
27
|
+
// `adw-switch-row {}` so <gtk-switch> is usable anywhere.
|
|
28
28
|
|
|
29
29
|
.adw-switch {
|
|
30
30
|
position: relative;
|
package/scss/_switch_row.scss
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// _switch_row.scss — adw-switch-row styling.
|
|
2
2
|
//
|
|
3
|
-
// The TOGGLE is not here: it is `<
|
|
3
|
+
// The TOGGLE is not here: it is `<gtk-switch>` and `scss/_switch.scss`. It used
|
|
4
4
|
// to be, nested under `adw-switch-row {`, which is exactly why `.adw-switch` was
|
|
5
5
|
// unreachable from anywhere else and `_expander_row.scss` grew a
|
|
6
6
|
// character-for-character copy of it.
|
package/scss/_toast.scss
CHANGED
|
@@ -121,7 +121,7 @@ adw-toast-overlay {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
// Close affordance — `window-close-symbolic` in a 24px circle, as upstream builds it
|
|
124
|
-
// (adw-toast-widget.ui:64). The element supplies the <
|
|
124
|
+
// (adw-toast-widget.ui:64). The element supplies the <gtk-image>; this only places it.
|
|
125
125
|
.adw-toast-close-button {
|
|
126
126
|
box-sizing: border-box;
|
|
127
127
|
flex-shrink: 0;
|
package/scss/adwaita-skin.scss
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// Style-isolation boundary — emitted before the components so their own rules
|
|
14
14
|
// override this typographic/box-model floor (see _reset.scss).
|
|
15
15
|
@use 'reset';
|
|
16
|
-
// The ONE symbolic-icon box, behind <
|
|
16
|
+
// The ONE symbolic-icon box, behind <gtk-image>. Emitted before every widget that
|
|
17
17
|
// draws one, so a context that sizes its own icons (the about dialog's 96px, the
|
|
18
18
|
// split button's 14px arrows, the view switcher's 16px) still wins on ordinary
|
|
19
19
|
// specificity.
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
@use 'menu_button';
|
|
47
47
|
@use 'drop_down';
|
|
48
48
|
@use 'toggle_group';
|
|
49
|
-
// The ONE toggle, behind <
|
|
49
|
+
// The ONE toggle, behind <gtk-switch>. Emitted before `switch_row` and
|
|
50
50
|
// `expander_row`, the two widgets that host one — and which each carried their
|
|
51
51
|
// own copy of it until it was lifted out of `adw-switch-row {}`.
|
|
52
52
|
@use 'switch';
|
|
@@ -253,9 +253,9 @@ export const AdwActionRowsTest = async () => {
|
|
|
253
253
|
setAttr(row, 'start-icon-name', vector.startIconName);
|
|
254
254
|
setAttr(row, 'end-icon-name', vector.endIconName);
|
|
255
255
|
|
|
256
|
-
// The two `image.icon.{start,end}` nodes are <
|
|
256
|
+
// The two `image.icon.{start,end}` nodes are <gtk-image>, not hand-rolled
|
|
257
257
|
// decorative spans.
|
|
258
|
-
const icons = Array.from(row.querySelectorAll('
|
|
258
|
+
const icons = Array.from(row.querySelectorAll('gtk-image')) as HTMLElement[];
|
|
259
259
|
expect(icons.length).toBe(2);
|
|
260
260
|
expect(!icons[0]!.hidden).toBe(vector.startIconVisible);
|
|
261
261
|
expect(!icons[1]!.hidden).toBe(vector.endIconVisible);
|
|
@@ -122,7 +122,7 @@ export const AdwButtonContentTest = async () => {
|
|
|
122
122
|
// the generated classes never carry `-symbolic`. This element used
|
|
123
123
|
// to interpolate the raw name, so `icon-name="folder-download-symbolic"`
|
|
124
124
|
// asked for `.adw-icon--folder-download-symbolic`, a class that has
|
|
125
|
-
// never existed, and drew an empty 16px box. `<
|
|
125
|
+
// never existed, and drew an empty 16px box. `<gtk-image>` applies
|
|
126
126
|
// `normalizeIconName`, which also makes the `' '` row assertable
|
|
127
127
|
// instead of skipped: a space is not one CSS token, so it lands on
|
|
128
128
|
// `image-missing` — the missing icon that row's own rule records GTK
|
package/src/bottom-sheet.spec.ts
CHANGED
|
@@ -259,7 +259,7 @@ export const AdwBottomSheetTest = async () => {
|
|
|
259
259
|
const tpl = document.createElement('template');
|
|
260
260
|
tpl.innerHTML =
|
|
261
261
|
'<adw-bottom-sheet open="true" modal="true" can-close="true">' +
|
|
262
|
-
'<adw-bottom-sheet-content><
|
|
262
|
+
'<adw-bottom-sheet-content><gtk-button pill>Toggle sheet</gtk-button></adw-bottom-sheet-content>' +
|
|
263
263
|
'<adw-bottom-sheet-sheet><button id="inside">Inside</button></adw-bottom-sheet-sheet>' +
|
|
264
264
|
'</adw-bottom-sheet>';
|
|
265
265
|
const stage = document.createElement('div');
|
|
@@ -269,7 +269,7 @@ export const AdwBottomSheetTest = async () => {
|
|
|
269
269
|
const sheet = stage.querySelector('adw-bottom-sheet') as AdwBottomSheet;
|
|
270
270
|
expect(sheet.open).toBe(true);
|
|
271
271
|
|
|
272
|
-
const toggle = sheet.querySelector('.adw-bottom-sheet-content
|
|
272
|
+
const toggle = sheet.querySelector('.adw-bottom-sheet-content gtk-button') as HTMLElement;
|
|
273
273
|
expect(toggle).toBeTruthy();
|
|
274
274
|
expect(insideSheet(sheet).id).toBe('inside');
|
|
275
275
|
// What the page binds: a listener on the custom element, driven by a click
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// DOM-level tests for <
|
|
1
|
+
// DOM-level tests for <gtk-check-button> and <adw-radio>, plus the browser side of
|
|
2
2
|
// the `RADIO_GROUP_VECTORS` conformance table.
|
|
3
3
|
//
|
|
4
4
|
// The browser's native radio exclusivity is NOT enough: `<input type="radio" name="g">`
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import { describe, expect, it } from '@gjsify/unit';
|
|
15
15
|
import { RADIO_GROUP_VECTORS } from '@gjsify/adwaita-core/conformance';
|
|
16
16
|
|
|
17
|
-
import type {
|
|
17
|
+
import type { GtkCheckButton, AdwRadio } from './elements/checks.js';
|
|
18
18
|
|
|
19
19
|
function host(): HTMLElement {
|
|
20
20
|
const el = document.createElement('div');
|
|
@@ -22,9 +22,9 @@ function host(): HTMLElement {
|
|
|
22
22
|
return el;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
function mountCheckbox(): { el:
|
|
25
|
+
function mountCheckbox(): { el: GtkCheckButton; parent: HTMLElement } {
|
|
26
26
|
const parent = host();
|
|
27
|
-
const el = document.createElement('
|
|
27
|
+
const el = document.createElement('gtk-check-button') as GtkCheckButton;
|
|
28
28
|
parent.appendChild(el);
|
|
29
29
|
return { el, parent };
|
|
30
30
|
}
|
|
@@ -51,7 +51,7 @@ function glyph(check: HTMLElement): string {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export const AdwChecksTest = async () => {
|
|
54
|
-
await describe('<
|
|
54
|
+
await describe('<gtk-check-button> state', async () => {
|
|
55
55
|
await it('builds the input + indicator + label markup', () => {
|
|
56
56
|
const { el, parent } = mountCheckbox();
|
|
57
57
|
const { input, indicator, label } = parts(el);
|
|
@@ -69,13 +69,13 @@ export const AdwChecksTest = async () => {
|
|
|
69
69
|
|
|
70
70
|
await it('adopts authored child nodes as the label, and the attribute wins', () => {
|
|
71
71
|
const parent = host();
|
|
72
|
-
const authored = document.createElement('
|
|
72
|
+
const authored = document.createElement('gtk-check-button') as GtkCheckButton;
|
|
73
73
|
authored.textContent = 'Enable';
|
|
74
74
|
parent.appendChild(authored);
|
|
75
75
|
expect(parts(authored).label.textContent).toBe('Enable');
|
|
76
76
|
expect(parts(authored).label.hidden).toBe(false);
|
|
77
77
|
|
|
78
|
-
const labelled = document.createElement('
|
|
78
|
+
const labelled = document.createElement('gtk-check-button') as GtkCheckButton;
|
|
79
79
|
labelled.setAttribute('label', 'From the attribute');
|
|
80
80
|
labelled.textContent = 'ignored';
|
|
81
81
|
parent.appendChild(labelled);
|
|
@@ -133,7 +133,7 @@ export const AdwChecksTest = async () => {
|
|
|
133
133
|
});
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
-
await describe('<
|
|
136
|
+
await describe('<gtk-check-button> indeterminate', async () => {
|
|
137
137
|
await it('announces as mixed and outranks checked', () => {
|
|
138
138
|
const { el, parent } = mountCheckbox();
|
|
139
139
|
el.checked = true;
|
|
@@ -152,7 +152,7 @@ export const AdwChecksTest = async () => {
|
|
|
152
152
|
// three states proves the cascade, not just that a mask exists.
|
|
153
153
|
const parent = host();
|
|
154
154
|
const make = (attrs: string[]) => {
|
|
155
|
-
const el = document.createElement('
|
|
155
|
+
const el = document.createElement('gtk-check-button') as GtkCheckButton;
|
|
156
156
|
for (const attr of attrs) el.setAttribute(attr, '');
|
|
157
157
|
parent.appendChild(el);
|
|
158
158
|
return el;
|
|
@@ -181,7 +181,7 @@ export const AdwChecksTest = async () => {
|
|
|
181
181
|
await describe('check and radio share one stylesheet', async () => {
|
|
182
182
|
await it('both draw the 14px + 3px indicator, differing only in the radius', () => {
|
|
183
183
|
const parent = host();
|
|
184
|
-
const check = document.createElement('
|
|
184
|
+
const check = document.createElement('gtk-check-button') as GtkCheckButton;
|
|
185
185
|
const radio = document.createElement('adw-radio') as AdwRadio;
|
|
186
186
|
parent.append(check, radio);
|
|
187
187
|
|
|
@@ -219,7 +219,7 @@ export const AdwChecksTest = async () => {
|
|
|
219
219
|
radio.setAttribute('name', 'fill-checked');
|
|
220
220
|
radio.setAttribute('value', 'x');
|
|
221
221
|
radio.setAttribute('checked', '');
|
|
222
|
-
const check = document.createElement('
|
|
222
|
+
const check = document.createElement('gtk-check-button') as GtkCheckButton;
|
|
223
223
|
check.setAttribute('checked', '');
|
|
224
224
|
parent.append(plain, radio, check);
|
|
225
225
|
|
package/src/chrome.spec.ts
CHANGED
|
@@ -153,7 +153,7 @@ const ROOT_ACTION_PREVIEW = `
|
|
|
153
153
|
<adw-window-title slot="center" title="Contacts"></adw-window-title>
|
|
154
154
|
</adw-header-bar>
|
|
155
155
|
<div style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">
|
|
156
|
-
<
|
|
156
|
+
<gtk-button label="Open contact" pill suggested></gtk-button>
|
|
157
157
|
</div>
|
|
158
158
|
</adw-toolbar-view>`;
|
|
159
159
|
|
|
@@ -530,7 +530,7 @@ export const AdwChromeTest = async () => {
|
|
|
530
530
|
const host = mountPreview(ROOT_ACTION_PREVIEW);
|
|
531
531
|
await settle();
|
|
532
532
|
const area = host.querySelector('.adw-toolbar-view-content') as HTMLElement;
|
|
533
|
-
const button = host.querySelector('
|
|
533
|
+
const button = host.querySelector('gtk-button') as HTMLElement;
|
|
534
534
|
|
|
535
535
|
expect(heightOf(area.firstElementChild)).toBe(heightOf(area));
|
|
536
536
|
// A pill button that grew to the pane's height would be the fill applied
|
|
@@ -24,10 +24,14 @@
|
|
|
24
24
|
import { describe, expect, it } from '@gjsify/unit';
|
|
25
25
|
|
|
26
26
|
import * as adwaitaWeb from './index.js';
|
|
27
|
+
// Not a bare `Object.values` walk: since ADR 0034 § Amendment 6 the widget classes are
|
|
28
|
+
// members of the exported `Adw`/`Gtk` objects, so a top-level scan reaches only the
|
|
29
|
+
// web-only stragglers while reading as if it swept the package.
|
|
30
|
+
import { exportedElementClasses } from './exported-elements.js';
|
|
27
31
|
|
|
28
32
|
/**
|
|
29
33
|
* Elements that cannot RENDER a child, however the DOM lets you append one. A container
|
|
30
|
-
* getter returning one of these is an imperative handle (`<
|
|
34
|
+
* getter returning one of these is an imperative handle (`<gtk-entry>.input`, for
|
|
31
35
|
* focus and selection), not an append point, and appending to it measures 0 forever.
|
|
32
36
|
* The HTML void-element set, not a per-widget ledger — a new container still enrols
|
|
33
37
|
* itself; only a new void element in the spec would need a line here.
|
|
@@ -85,9 +89,8 @@ function reveal(el: HTMLElement): void {
|
|
|
85
89
|
function registeredElements(): { tags: string[]; unregistered: string[] } {
|
|
86
90
|
const tags: string[] = [];
|
|
87
91
|
const unregistered: string[] = [];
|
|
88
|
-
for (const exported of
|
|
89
|
-
|
|
90
|
-
const tag = customElements.getName(exported as CustomElementConstructor);
|
|
92
|
+
for (const exported of exportedElementClasses(adwaitaWeb)) {
|
|
93
|
+
const tag = customElements.getName(exported);
|
|
91
94
|
if (tag === null) unregistered.push(exported.name);
|
|
92
95
|
else tags.push(tag);
|
|
93
96
|
}
|
|
@@ -101,7 +104,7 @@ function registeredElements(): { tags: string[]; unregistered: string[] } {
|
|
|
101
104
|
* Each half earns its place. No setter, because a container you append into is not one
|
|
102
105
|
* you replace by assignment — that is what separates `topBar` from `anchor` and
|
|
103
106
|
* `activatableWidget`. Contained, because the handle has to be part of THIS widget's
|
|
104
|
-
* own subtree — `<
|
|
107
|
+
* own subtree — `<gtk-popover>.anchor` defaults to `parentElement` and is not. And a
|
|
105
108
|
* value that is not an element at all (`items`, `groups`, a `null` slot on an empty
|
|
106
109
|
* widget) is nothing to append to.
|
|
107
110
|
*
|
|
@@ -326,9 +329,9 @@ export const AdwConnectLifecycleTest = async () => {
|
|
|
326
329
|
});
|
|
327
330
|
}
|
|
328
331
|
|
|
329
|
-
await it('<
|
|
332
|
+
await it('<gtk-popover> still dismisses on an outside click after a move', async () => {
|
|
330
333
|
const first = visibleHost();
|
|
331
|
-
const popover = document.createElement('
|
|
334
|
+
const popover = document.createElement('gtk-popover');
|
|
332
335
|
first.appendChild(popover);
|
|
333
336
|
(popover as HTMLElement & { popup(): void }).popup();
|
|
334
337
|
|