@gtkx/react 0.19.0 → 0.21.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.
Files changed (289) hide show
  1. package/README.md +26 -62
  2. package/dist/components/compound.d.ts +40 -0
  3. package/dist/components/compound.d.ts.map +1 -0
  4. package/dist/components/compound.js +46 -0
  5. package/dist/components/compound.js.map +1 -0
  6. package/dist/components/list.d.ts +75 -0
  7. package/dist/components/list.d.ts.map +1 -0
  8. package/dist/components/list.js +81 -0
  9. package/dist/components/list.js.map +1 -0
  10. package/dist/components/slot-widget.d.ts +15 -0
  11. package/dist/components/slot-widget.d.ts.map +1 -0
  12. package/dist/components/slot-widget.js +37 -0
  13. package/dist/components/slot-widget.js.map +1 -0
  14. package/dist/errors.d.ts +6 -0
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +8 -6
  17. package/dist/errors.js.map +1 -1
  18. package/dist/generated/compounds.d.ts +2672 -0
  19. package/dist/generated/compounds.d.ts.map +1 -0
  20. package/dist/generated/compounds.js +2624 -0
  21. package/dist/generated/compounds.js.map +1 -0
  22. package/dist/generated/internal.d.ts +6 -7
  23. package/dist/generated/internal.d.ts.map +1 -1
  24. package/dist/generated/internal.js +3054 -1838
  25. package/dist/generated/internal.js.map +1 -1
  26. package/dist/generated/jsx.d.ts +2096 -4970
  27. package/dist/generated/jsx.d.ts.map +1 -1
  28. package/dist/generated/jsx.js +979 -3862
  29. package/dist/generated/jsx.js.map +1 -1
  30. package/dist/generated/registry.d.ts +1 -0
  31. package/dist/generated/registry.d.ts.map +1 -1
  32. package/dist/generated/registry.js +0 -1
  33. package/dist/generated/registry.js.map +1 -1
  34. package/dist/host-config.d.ts.map +1 -1
  35. package/dist/host-config.js +2 -0
  36. package/dist/host-config.js.map +1 -1
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/jsx.d.ts +157 -518
  42. package/dist/jsx.d.ts.map +1 -1
  43. package/dist/jsx.js +6 -393
  44. package/dist/jsx.js.map +1 -1
  45. package/dist/metadata.d.ts +1 -1
  46. package/dist/metadata.d.ts.map +1 -1
  47. package/dist/metadata.js +7 -3
  48. package/dist/metadata.js.map +1 -1
  49. package/dist/node.d.ts +0 -4
  50. package/dist/node.d.ts.map +1 -1
  51. package/dist/node.js +19 -41
  52. package/dist/node.js.map +1 -1
  53. package/dist/nodes/alert-dialog.d.ts +14 -0
  54. package/dist/nodes/alert-dialog.d.ts.map +1 -0
  55. package/dist/nodes/alert-dialog.js +41 -0
  56. package/dist/nodes/alert-dialog.js.map +1 -0
  57. package/dist/nodes/animation.d.ts +5 -4
  58. package/dist/nodes/animation.d.ts.map +1 -1
  59. package/dist/nodes/animation.js +65 -49
  60. package/dist/nodes/animation.js.map +1 -1
  61. package/dist/nodes/application.d.ts.map +1 -1
  62. package/dist/nodes/application.js +4 -0
  63. package/dist/nodes/application.js.map +1 -1
  64. package/dist/nodes/column-view-column.d.ts +19 -19
  65. package/dist/nodes/column-view-column.d.ts.map +1 -1
  66. package/dist/nodes/column-view-column.js +130 -119
  67. package/dist/nodes/column-view-column.js.map +1 -1
  68. package/dist/nodes/container-slot.d.ts +3 -1
  69. package/dist/nodes/container-slot.d.ts.map +1 -1
  70. package/dist/nodes/container-slot.js +28 -16
  71. package/dist/nodes/container-slot.js.map +1 -1
  72. package/dist/nodes/drawing-area.d.ts +3 -1
  73. package/dist/nodes/drawing-area.d.ts.map +1 -1
  74. package/dist/nodes/drawing-area.js +20 -22
  75. package/dist/nodes/drawing-area.js.map +1 -1
  76. package/dist/nodes/event-controller.d.ts.map +1 -1
  77. package/dist/nodes/event-controller.js +6 -16
  78. package/dist/nodes/event-controller.js.map +1 -1
  79. package/dist/nodes/fixed-child.d.ts +1 -0
  80. package/dist/nodes/fixed-child.d.ts.map +1 -1
  81. package/dist/nodes/fixed-child.js +13 -0
  82. package/dist/nodes/fixed-child.js.map +1 -1
  83. package/dist/nodes/grid-child.d.ts +1 -0
  84. package/dist/nodes/grid-child.d.ts.map +1 -1
  85. package/dist/nodes/grid-child.js +13 -0
  86. package/dist/nodes/grid-child.js.map +1 -1
  87. package/dist/nodes/internal/accessible.d.ts.map +1 -1
  88. package/dist/nodes/internal/accessible.js.map +1 -1
  89. package/dist/nodes/internal/bound-item.d.ts +4 -0
  90. package/dist/nodes/internal/bound-item.d.ts.map +1 -0
  91. package/dist/nodes/internal/bound-item.js +2 -0
  92. package/dist/nodes/internal/bound-item.js.map +1 -0
  93. package/dist/nodes/internal/construct.d.ts +1 -8
  94. package/dist/nodes/internal/construct.d.ts.map +1 -1
  95. package/dist/nodes/internal/construct.js +30 -54
  96. package/dist/nodes/internal/construct.js.map +1 -1
  97. package/dist/nodes/internal/widget.d.ts.map +1 -1
  98. package/dist/nodes/internal/widget.js +9 -10
  99. package/dist/nodes/internal/widget.js.map +1 -1
  100. package/dist/nodes/list-item-node.d.ts +12 -0
  101. package/dist/nodes/list-item-node.d.ts.map +1 -0
  102. package/dist/nodes/list-item-node.js +45 -0
  103. package/dist/nodes/list-item-node.js.map +1 -0
  104. package/dist/nodes/list.d.ts +100 -0
  105. package/dist/nodes/list.d.ts.map +1 -0
  106. package/dist/nodes/list.js +950 -0
  107. package/dist/nodes/list.js.map +1 -0
  108. package/dist/nodes/notebook-page.d.ts.map +1 -1
  109. package/dist/nodes/notebook-page.js +6 -2
  110. package/dist/nodes/notebook-page.js.map +1 -1
  111. package/dist/nodes/overlay-child.d.ts +2 -0
  112. package/dist/nodes/overlay-child.d.ts.map +1 -1
  113. package/dist/nodes/overlay-child.js +29 -8
  114. package/dist/nodes/overlay-child.js.map +1 -1
  115. package/dist/nodes/spin-row.d.ts +14 -0
  116. package/dist/nodes/spin-row.d.ts.map +1 -0
  117. package/dist/nodes/spin-row.js +46 -0
  118. package/dist/nodes/spin-row.js.map +1 -0
  119. package/dist/nodes/switch-row.d.ts +11 -0
  120. package/dist/nodes/switch-row.d.ts.map +1 -0
  121. package/dist/nodes/switch-row.js +15 -0
  122. package/dist/nodes/switch-row.js.map +1 -0
  123. package/dist/nodes/text-anchor.d.ts.map +1 -1
  124. package/dist/nodes/text-anchor.js +10 -0
  125. package/dist/nodes/text-anchor.js.map +1 -1
  126. package/dist/nodes/text-tag.d.ts.map +1 -1
  127. package/dist/nodes/text-tag.js +45 -39
  128. package/dist/nodes/text-tag.js.map +1 -1
  129. package/dist/nodes/toggle-group.d.ts +12 -6
  130. package/dist/nodes/toggle-group.d.ts.map +1 -1
  131. package/dist/nodes/toggle-group.js +53 -4
  132. package/dist/nodes/toggle-group.js.map +1 -1
  133. package/dist/nodes/widget.d.ts.map +1 -1
  134. package/dist/nodes/widget.js +16 -22
  135. package/dist/nodes/widget.js.map +1 -1
  136. package/dist/nodes/window.d.ts.map +1 -1
  137. package/dist/nodes/window.js +2 -2
  138. package/dist/nodes/window.js.map +1 -1
  139. package/dist/registry.d.ts +0 -2
  140. package/dist/registry.d.ts.map +1 -1
  141. package/dist/registry.js +11 -18
  142. package/dist/registry.js.map +1 -1
  143. package/dist/types.d.ts +3 -2
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/use-property.d.ts +29 -0
  146. package/dist/use-property.d.ts.map +1 -0
  147. package/dist/use-property.js +44 -0
  148. package/dist/use-property.js.map +1 -0
  149. package/dist/use-setting.d.ts +36 -0
  150. package/dist/use-setting.d.ts.map +1 -0
  151. package/dist/use-setting.js +68 -0
  152. package/dist/use-setting.js.map +1 -0
  153. package/package.json +5 -4
  154. package/src/components/compound.tsx +57 -0
  155. package/src/components/list.tsx +140 -0
  156. package/src/components/slot-widget.tsx +46 -0
  157. package/src/errors.ts +8 -7
  158. package/src/generated/compounds.ts +2741 -0
  159. package/src/generated/internal.ts +3059 -1840
  160. package/src/generated/jsx.ts +2509 -5350
  161. package/src/generated/registry.ts +2 -1
  162. package/src/host-config.ts +2 -0
  163. package/src/index.ts +2 -0
  164. package/src/jsx.ts +167 -581
  165. package/src/metadata.ts +7 -4
  166. package/src/node.ts +23 -39
  167. package/src/nodes/alert-dialog.ts +55 -0
  168. package/src/nodes/animation.ts +67 -60
  169. package/src/nodes/application.ts +5 -0
  170. package/src/nodes/column-view-column.ts +125 -128
  171. package/src/nodes/container-slot.ts +30 -17
  172. package/src/nodes/drawing-area.ts +23 -32
  173. package/src/nodes/event-controller.ts +6 -18
  174. package/src/nodes/fixed-child.ts +13 -0
  175. package/src/nodes/grid-child.ts +13 -0
  176. package/src/nodes/internal/accessible.ts +0 -1
  177. package/src/nodes/internal/bound-item.ts +4 -0
  178. package/src/nodes/internal/construct.ts +38 -68
  179. package/src/nodes/internal/widget.ts +9 -13
  180. package/src/nodes/list-item-node.ts +53 -0
  181. package/src/nodes/list.ts +1082 -0
  182. package/src/nodes/notebook-page.ts +6 -2
  183. package/src/nodes/overlay-child.ts +30 -9
  184. package/src/nodes/spin-row.ts +72 -0
  185. package/src/nodes/switch-row.ts +26 -0
  186. package/src/nodes/text-anchor.ts +9 -0
  187. package/src/nodes/text-tag.ts +45 -40
  188. package/src/nodes/toggle-group.ts +63 -9
  189. package/src/nodes/widget.ts +14 -26
  190. package/src/nodes/window.ts +2 -2
  191. package/src/registry.ts +18 -24
  192. package/src/types.ts +8 -2
  193. package/src/use-property.ts +58 -0
  194. package/src/use-setting.ts +96 -0
  195. package/dist/fiber-root.d.ts +0 -4
  196. package/dist/fiber-root.d.ts.map +0 -1
  197. package/dist/fiber-root.js +0 -6
  198. package/dist/fiber-root.js.map +0 -1
  199. package/dist/nodes/column-view.d.ts +0 -37
  200. package/dist/nodes/column-view.d.ts.map +0 -1
  201. package/dist/nodes/column-view.js +0 -205
  202. package/dist/nodes/column-view.js.map +0 -1
  203. package/dist/nodes/drop-down.d.ts +0 -37
  204. package/dist/nodes/drop-down.d.ts.map +0 -1
  205. package/dist/nodes/drop-down.js +0 -231
  206. package/dist/nodes/drop-down.js.map +0 -1
  207. package/dist/nodes/grid-view.d.ts +0 -30
  208. package/dist/nodes/grid-view.d.ts.map +0 -1
  209. package/dist/nodes/grid-view.js +0 -90
  210. package/dist/nodes/grid-view.js.map +0 -1
  211. package/dist/nodes/internal/base-item-renderer.d.ts +0 -28
  212. package/dist/nodes/internal/base-item-renderer.d.ts.map +0 -1
  213. package/dist/nodes/internal/base-item-renderer.js +0 -85
  214. package/dist/nodes/internal/base-item-renderer.js.map +0 -1
  215. package/dist/nodes/internal/grid-item-renderer.d.ts +0 -20
  216. package/dist/nodes/internal/grid-item-renderer.d.ts.map +0 -1
  217. package/dist/nodes/internal/grid-item-renderer.js +0 -66
  218. package/dist/nodes/internal/grid-item-renderer.js.map +0 -1
  219. package/dist/nodes/internal/header-item-renderer.d.ts +0 -23
  220. package/dist/nodes/internal/header-item-renderer.d.ts.map +0 -1
  221. package/dist/nodes/internal/header-item-renderer.js +0 -87
  222. package/dist/nodes/internal/header-item-renderer.js.map +0 -1
  223. package/dist/nodes/internal/header-renderer-manager.d.ts +0 -13
  224. package/dist/nodes/internal/header-renderer-manager.d.ts.map +0 -1
  225. package/dist/nodes/internal/header-renderer-manager.js +0 -20
  226. package/dist/nodes/internal/header-renderer-manager.js.map +0 -1
  227. package/dist/nodes/internal/list-item-renderer.d.ts +0 -27
  228. package/dist/nodes/internal/list-item-renderer.d.ts.map +0 -1
  229. package/dist/nodes/internal/list-item-renderer.js +0 -131
  230. package/dist/nodes/internal/list-item-renderer.js.map +0 -1
  231. package/dist/nodes/internal/list-store.d.ts +0 -21
  232. package/dist/nodes/internal/list-store.d.ts.map +0 -1
  233. package/dist/nodes/internal/list-store.js +0 -90
  234. package/dist/nodes/internal/list-store.js.map +0 -1
  235. package/dist/nodes/internal/sectioned-list-store.d.ts +0 -50
  236. package/dist/nodes/internal/sectioned-list-store.d.ts.map +0 -1
  237. package/dist/nodes/internal/sectioned-list-store.js +0 -250
  238. package/dist/nodes/internal/sectioned-list-store.js.map +0 -1
  239. package/dist/nodes/internal/selection-helpers.d.ts +0 -12
  240. package/dist/nodes/internal/selection-helpers.d.ts.map +0 -1
  241. package/dist/nodes/internal/selection-helpers.js +0 -25
  242. package/dist/nodes/internal/selection-helpers.js.map +0 -1
  243. package/dist/nodes/internal/selection-model-controller.d.ts +0 -26
  244. package/dist/nodes/internal/selection-model-controller.d.ts.map +0 -1
  245. package/dist/nodes/internal/selection-model-controller.js +0 -82
  246. package/dist/nodes/internal/selection-model-controller.js.map +0 -1
  247. package/dist/nodes/internal/simple-list-store.d.ts +0 -15
  248. package/dist/nodes/internal/simple-list-store.d.ts.map +0 -1
  249. package/dist/nodes/internal/simple-list-store.js +0 -110
  250. package/dist/nodes/internal/simple-list-store.js.map +0 -1
  251. package/dist/nodes/internal/tree-store.d.ts +0 -37
  252. package/dist/nodes/internal/tree-store.d.ts.map +0 -1
  253. package/dist/nodes/internal/tree-store.js +0 -253
  254. package/dist/nodes/internal/tree-store.js.map +0 -1
  255. package/dist/nodes/list-item.d.ts +0 -24
  256. package/dist/nodes/list-item.d.ts.map +0 -1
  257. package/dist/nodes/list-item.js +0 -83
  258. package/dist/nodes/list-item.js.map +0 -1
  259. package/dist/nodes/list-section.d.ts +0 -27
  260. package/dist/nodes/list-section.d.ts.map +0 -1
  261. package/dist/nodes/list-section.js +0 -43
  262. package/dist/nodes/list-section.js.map +0 -1
  263. package/dist/nodes/list-view.d.ts +0 -32
  264. package/dist/nodes/list-view.d.ts.map +0 -1
  265. package/dist/nodes/list-view.js +0 -123
  266. package/dist/nodes/list-view.js.map +0 -1
  267. package/dist/nodes/models/list.d.ts +0 -39
  268. package/dist/nodes/models/list.d.ts.map +0 -1
  269. package/dist/nodes/models/list.js +0 -207
  270. package/dist/nodes/models/list.js.map +0 -1
  271. package/src/fiber-root.ts +0 -20
  272. package/src/nodes/column-view.ts +0 -262
  273. package/src/nodes/drop-down.ts +0 -284
  274. package/src/nodes/grid-view.ts +0 -119
  275. package/src/nodes/internal/base-item-renderer.ts +0 -107
  276. package/src/nodes/internal/grid-item-renderer.ts +0 -78
  277. package/src/nodes/internal/header-item-renderer.ts +0 -105
  278. package/src/nodes/internal/header-renderer-manager.ts +0 -33
  279. package/src/nodes/internal/list-item-renderer.ts +0 -162
  280. package/src/nodes/internal/list-store.ts +0 -107
  281. package/src/nodes/internal/sectioned-list-store.ts +0 -287
  282. package/src/nodes/internal/selection-helpers.ts +0 -35
  283. package/src/nodes/internal/selection-model-controller.ts +0 -119
  284. package/src/nodes/internal/simple-list-store.ts +0 -116
  285. package/src/nodes/internal/tree-store.ts +0 -289
  286. package/src/nodes/list-item.ts +0 -107
  287. package/src/nodes/list-section.ts +0 -64
  288. package/src/nodes/list-view.ts +0 -164
  289. package/src/nodes/models/list.ts +0 -250
@@ -81,6 +81,10 @@ export class NotebookPageNode extends VirtualNode<NotebookPageProps, WidgetNode<
81
81
  public override detachDeletedInstance(): void {
82
82
  const childWidget = this.findContentChild()?.container ?? null;
83
83
  if (childWidget && this.parent) {
84
+ const notebook = this.getParentWidget();
85
+ if (notebook.getNPages() <= 1) {
86
+ notebook.setShowTabs(false);
87
+ }
84
88
  this.detachPage(childWidget);
85
89
  }
86
90
  super.detachDeletedInstance();
@@ -157,11 +161,11 @@ export class NotebookPageNode extends VirtualNode<NotebookPageProps, WidgetNode<
157
161
  if (!page) return;
158
162
 
159
163
  if (this.props.tabExpand !== undefined) {
160
- page.setTabExpand(this.props.tabExpand);
164
+ page.tabExpand = this.props.tabExpand;
161
165
  }
162
166
 
163
167
  if (this.props.tabFill !== undefined) {
164
- page.setTabFill(this.props.tabFill);
168
+ page.tabFill = this.props.tabFill;
165
169
  }
166
170
  }
167
171
 
@@ -1,6 +1,7 @@
1
1
  import * as Gtk from "@gtkx/ffi/gtk";
2
2
  import type { OverlayChildProps } from "../jsx.js";
3
3
  import type { Node } from "../node.js";
4
+ import { isRemovable } from "./internal/predicates.js";
4
5
  import { hasChanged } from "./internal/props.js";
5
6
  import { VirtualNode } from "./virtual.js";
6
7
  import { WidgetNode } from "./widget.js";
@@ -32,6 +33,7 @@ export class OverlayChildNode extends VirtualNode<OverlayChildProps, WidgetNode<
32
33
  super.appendChild(child);
33
34
 
34
35
  if (this.parent) {
36
+ this.detachFromGtkParent(child);
35
37
  this.attachToParent(this.parent.container, child.container);
36
38
  }
37
39
  }
@@ -40,19 +42,12 @@ export class OverlayChildNode extends VirtualNode<OverlayChildProps, WidgetNode<
40
42
  super.insertBefore(child, before);
41
43
 
42
44
  if (this.parent) {
43
- this.attachToParent(this.parent.container, child.container);
45
+ this.reinsertAllChildren();
44
46
  }
45
47
  }
46
48
 
47
49
  public override removeChild(child: WidgetNode): void {
48
- if (this.parent) {
49
- const widget = child.container;
50
- const currentParent = widget.getParent();
51
- if (currentParent && currentParent === this.parent.container) {
52
- this.parent.container.removeOverlay(widget);
53
- }
54
- }
55
-
50
+ this.detachFromGtkParent(child);
56
51
  super.removeChild(child);
57
52
  }
58
53
 
@@ -98,6 +93,32 @@ export class OverlayChildNode extends VirtualNode<OverlayChildProps, WidgetNode<
98
93
  }
99
94
  }
100
95
 
96
+ private detachFromGtkParent(child: WidgetNode): void {
97
+ const currentParent = child.container.getParent();
98
+ if (currentParent !== null) {
99
+ if (currentParent instanceof Gtk.Overlay) {
100
+ currentParent.removeOverlay(child.container);
101
+ } else if (isRemovable(currentParent)) {
102
+ currentParent.remove(child.container);
103
+ } else {
104
+ child.container.unparent();
105
+ }
106
+ }
107
+ }
108
+
109
+ private reinsertAllChildren(): void {
110
+ if (!this.parent) return;
111
+ const parent = this.parent.container;
112
+
113
+ for (const child of this.children) {
114
+ this.detachFromGtkParent(child);
115
+ }
116
+
117
+ for (const child of this.children) {
118
+ this.attachToParent(parent, child.container);
119
+ }
120
+ }
121
+
101
122
  private detachAllChildren(parent: Gtk.Overlay): void {
102
123
  for (const child of this.children) {
103
124
  const currentParent = child.container.getParent();
@@ -0,0 +1,72 @@
1
+ import type * as Adw from "@gtkx/ffi/adw";
2
+ import * as Gtk from "@gtkx/ffi/gtk";
3
+ import type { AdjustableProps } from "../jsx.js";
4
+ import { filterProps, hasChanged } from "./internal/props.js";
5
+ import { WidgetNode } from "./widget.js";
6
+
7
+ type SpinRowProps = AdjustableProps & {
8
+ onValueChanged?: ((value: number, self: Adw.SpinRow) => void) | null;
9
+ };
10
+
11
+ const OWN_PROPS = ["value", "lower", "upper", "stepIncrement", "pageIncrement", "pageSize", "onValueChanged"] as const;
12
+
13
+ export class SpinRowNode extends WidgetNode<Adw.SpinRow, SpinRowProps> {
14
+ private adjustment: Gtk.Adjustment | null = null;
15
+
16
+ public override commitUpdate(oldProps: SpinRowProps | null, newProps: SpinRowProps): void {
17
+ super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
18
+ this.applyOwnProps(oldProps, newProps);
19
+ }
20
+
21
+ private ensureAdjustment(props: SpinRowProps): Gtk.Adjustment {
22
+ if (!this.adjustment) {
23
+ this.adjustment = new Gtk.Adjustment(
24
+ props.value ?? 0,
25
+ props.lower ?? 0,
26
+ props.upper ?? 100,
27
+ props.stepIncrement ?? 1,
28
+ props.pageIncrement ?? 10,
29
+ props.pageSize ?? 0,
30
+ );
31
+
32
+ this.container.setAdjustment(this.adjustment);
33
+ }
34
+
35
+ return this.adjustment;
36
+ }
37
+
38
+ private applyOwnProps(oldProps: SpinRowProps | null, newProps: SpinRowProps): void {
39
+ const adjustment = this.ensureAdjustment(newProps);
40
+
41
+ if (hasChanged(oldProps, newProps, "onValueChanged")) {
42
+ const { onValueChanged } = newProps;
43
+ this.signalStore.set(
44
+ this,
45
+ this.container,
46
+ "notify::value",
47
+ onValueChanged ? (self: Adw.SpinRow) => onValueChanged(self.getValue(), self) : undefined,
48
+ );
49
+ }
50
+
51
+ if (!oldProps) return;
52
+
53
+ if (hasChanged(oldProps, newProps, "lower")) {
54
+ adjustment.setLower(newProps.lower ?? 0);
55
+ }
56
+ if (hasChanged(oldProps, newProps, "upper")) {
57
+ adjustment.setUpper(newProps.upper ?? 100);
58
+ }
59
+ if (hasChanged(oldProps, newProps, "stepIncrement")) {
60
+ adjustment.setStepIncrement(newProps.stepIncrement ?? 1);
61
+ }
62
+ if (hasChanged(oldProps, newProps, "pageIncrement")) {
63
+ adjustment.setPageIncrement(newProps.pageIncrement ?? 10);
64
+ }
65
+ if (hasChanged(oldProps, newProps, "pageSize")) {
66
+ adjustment.setPageSize(newProps.pageSize ?? 0);
67
+ }
68
+ if (hasChanged(oldProps, newProps, "value") && newProps.value !== undefined) {
69
+ adjustment.setValue(newProps.value);
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,26 @@
1
+ import type * as Adw from "@gtkx/ffi/adw";
2
+ import { hasChanged } from "./internal/props.js";
3
+ import { WidgetNode } from "./widget.js";
4
+
5
+ type SwitchRowProps = {
6
+ onActiveChanged?: ((active: boolean, self: Adw.SwitchRow) => void) | null;
7
+ };
8
+
9
+ export class SwitchRowNode extends WidgetNode<Adw.SwitchRow, SwitchRowProps> {
10
+ public override commitUpdate(oldProps: SwitchRowProps | null, newProps: SwitchRowProps): void {
11
+ super.commitUpdate(oldProps, newProps);
12
+ this.applyOwnProps(oldProps, newProps);
13
+ }
14
+
15
+ private applyOwnProps(oldProps: SwitchRowProps | null, newProps: SwitchRowProps): void {
16
+ if (hasChanged(oldProps, newProps, "onActiveChanged")) {
17
+ const { onActiveChanged } = newProps;
18
+ this.signalStore.set(
19
+ this,
20
+ this.container,
21
+ "notify::active",
22
+ onActiveChanged ? (self: Adw.SwitchRow) => onActiveChanged(self.getActive(), self) : undefined,
23
+ );
24
+ }
25
+ }
26
+ }
@@ -1,6 +1,7 @@
1
1
  import * as Gtk from "@gtkx/ffi/gtk";
2
2
  import type { TextAnchorProps } from "../jsx.js";
3
3
  import type { Node } from "../node.js";
4
+ import { isRemovable } from "./internal/predicates.js";
4
5
  import { TEXT_OBJECT_REPLACEMENT, type TextContentParent } from "./text-content.js";
5
6
  import { isTextContentParent } from "./text-segment.js";
6
7
  import { VirtualNode } from "./virtual.js";
@@ -66,6 +67,14 @@ export class TextAnchorNode extends VirtualNode<TextAnchorProps, Node & TextCont
66
67
  super.appendChild(child);
67
68
 
68
69
  if (this.textView && this.anchor && child.container) {
70
+ const currentParent = child.container.getParent();
71
+ if (currentParent !== null) {
72
+ if (isRemovable(currentParent)) {
73
+ currentParent.remove(child.container);
74
+ } else {
75
+ child.container.unparent();
76
+ }
77
+ }
69
78
  this.textView.addChildAtAnchor(child.container, this.anchor);
70
79
  }
71
80
  }
@@ -8,45 +8,45 @@ import { TextPaintableNode } from "./text-paintable.js";
8
8
  import { isTextContentParent, TextSegmentNode } from "./text-segment.js";
9
9
  import { VirtualNode } from "./virtual.js";
10
10
 
11
- const STYLE_PROPS: Partial<Record<keyof TextTagProps, keyof Gtk.TextTag>> = {
11
+ const STYLE_PROPS: Partial<Record<keyof TextTagProps, keyof Gtk.TextTag | string>> = {
12
12
  background: "setBackground",
13
- backgroundFullHeight: "setBackgroundFullHeight",
13
+ backgroundFullHeight: "backgroundFullHeight",
14
14
  foreground: "setForeground",
15
- family: "setFamily",
16
- font: "setFont",
17
- sizePoints: "setSizePoints",
18
- size: "setSize",
19
- scale: "setScale",
20
- weight: "setWeight",
21
- style: "setStyle",
22
- stretch: "setStretch",
23
- variant: "setVariant",
24
- strikethrough: "setStrikethrough",
25
- underline: "setUnderline",
26
- overline: "setOverline",
27
- rise: "setRise",
28
- letterSpacing: "setLetterSpacing",
29
- lineHeight: "setLineHeight",
30
- leftMargin: "setLeftMargin",
31
- rightMargin: "setRightMargin",
32
- indent: "setIndent",
33
- pixelsAboveLines: "setPixelsAboveLines",
34
- pixelsBelowLines: "setPixelsBelowLines",
35
- pixelsInsideWrap: "setPixelsInsideWrap",
36
- justification: "setJustification",
37
- direction: "setDirection",
38
- wrapMode: "setWrapMode",
39
- editable: "setEditable",
40
- invisible: "setInvisible",
41
- allowBreaks: "setAllowBreaks",
42
- insertHyphens: "setInsertHyphens",
43
- fallback: "setFallback",
44
- accumulativeMargin: "setAccumulativeMargin",
15
+ family: "family",
16
+ font: "font",
17
+ sizePoints: "sizePoints",
18
+ size: "size",
19
+ scale: "scale",
20
+ weight: "weight",
21
+ style: "style",
22
+ stretch: "stretch",
23
+ variant: "variant",
24
+ strikethrough: "strikethrough",
25
+ underline: "underline",
26
+ overline: "overline",
27
+ rise: "rise",
28
+ letterSpacing: "letterSpacing",
29
+ lineHeight: "lineHeight",
30
+ leftMargin: "leftMargin",
31
+ rightMargin: "rightMargin",
32
+ indent: "indent",
33
+ pixelsAboveLines: "pixelsAboveLines",
34
+ pixelsBelowLines: "pixelsBelowLines",
35
+ pixelsInsideWrap: "pixelsInsideWrap",
36
+ justification: "justification",
37
+ direction: "direction",
38
+ wrapMode: "wrapMode",
39
+ editable: "editable",
40
+ invisible: "invisible",
41
+ allowBreaks: "allowBreaks",
42
+ insertHyphens: "insertHyphens",
43
+ fallback: "fallback",
44
+ accumulativeMargin: "accumulativeMargin",
45
45
  paragraphBackground: "setParagraphBackground",
46
- showSpaces: "setShowSpaces",
47
- textTransform: "setTextTransform",
48
- fontFeatures: "setFontFeatures",
49
- language: "setLanguage",
46
+ showSpaces: "showSpaces",
47
+ textTransform: "textTransform",
48
+ fontFeatures: "fontFeatures",
49
+ language: "language",
50
50
  };
51
51
 
52
52
  type TextTagParent = Node & TextContentParent;
@@ -225,10 +225,15 @@ export class TextTagNode
225
225
  for (const prop of Object.keys(STYLE_PROPS) as (keyof TextTagProps)[]) {
226
226
  if (hasChanged(oldProps, newProps, prop)) {
227
227
  const value = newProps[prop];
228
- const method = STYLE_PROPS[prop];
229
- if (value !== undefined && method) {
230
- const setter = this.tag[method] as (value: unknown) => void;
231
- setter.call(this.tag, value);
228
+ const target = STYLE_PROPS[prop];
229
+ if (value !== undefined && target) {
230
+ const tag = this.tag as unknown as Record<string, unknown>;
231
+ const member = tag[target];
232
+ if (typeof member === "function") {
233
+ (member as (v: unknown) => void).call(this.tag, value);
234
+ } else {
235
+ tag[target] = value;
236
+ }
232
237
  }
233
238
  }
234
239
  }
@@ -1,19 +1,41 @@
1
- import type * as Adw from "@gtkx/ffi/adw";
2
- import type { AdwToggleGroupProps } from "../jsx.js";
1
+ import * as Adw from "@gtkx/ffi/adw";
2
+ import type * as Gtk from "@gtkx/ffi/gtk";
3
+ import type { AdwToggleGroupProps, ToggleProps } from "../jsx.js";
4
+ import type { Container, Props } from "../types.js";
5
+ import { createContainerWithProperties } from "./internal/construct.js";
3
6
  import { filterProps, hasChanged } from "./internal/props.js";
4
7
  import { WidgetNode } from "./widget.js";
5
8
 
6
- const OWN_PROPS = ["onActiveChanged"] as const;
9
+ const DEFERRED_PROPS = ["activeName", "active"] as const;
10
+ const OWN_PROPS = ["onActiveChanged", "toggles", ...DEFERRED_PROPS] as const;
7
11
 
8
- type ToggleGroupProps = Pick<AdwToggleGroupProps, (typeof OWN_PROPS)[number]>;
12
+ type OwnProps = Pick<AdwToggleGroupProps, (typeof OWN_PROPS)[number]>;
9
13
 
10
- export class ToggleGroupNode extends WidgetNode<Adw.ToggleGroup, ToggleGroupProps> {
11
- public override commitUpdate(oldProps: ToggleGroupProps | null, newProps: ToggleGroupProps): void {
12
- super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
13
- this.applyOwnProps(oldProps, newProps);
14
+ export class ToggleGroupNode extends WidgetNode<Adw.ToggleGroup, OwnProps> {
15
+ private managedToggles: Adw.Toggle[] = [];
16
+
17
+ public static override createContainer(props: Props, containerClass: typeof Gtk.Widget): Container | null {
18
+ const { activeName: _, active: __, ...rest } = props;
19
+ return createContainerWithProperties(containerClass, rest);
14
20
  }
15
21
 
16
- private applyOwnProps(oldProps: ToggleGroupProps | null, newProps: ToggleGroupProps): void {
22
+ public override commitUpdate(oldProps: OwnProps | null, newProps: OwnProps): void {
23
+ if (hasChanged(oldProps, newProps, "toggles")) {
24
+ this.syncToggles(newProps.toggles ?? []);
25
+ }
26
+
27
+ super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
28
+
29
+ if (hasChanged(oldProps, newProps, "activeName")) {
30
+ this.container.setActiveName(newProps.activeName ?? null);
31
+ }
32
+
33
+ if (hasChanged(oldProps, newProps, "active")) {
34
+ if (newProps.active != null) {
35
+ this.container.setActive(newProps.active);
36
+ }
37
+ }
38
+
17
39
  if (hasChanged(oldProps, newProps, "onActiveChanged")) {
18
40
  const callback = newProps.onActiveChanged;
19
41
  this.signalStore.set(
@@ -24,4 +46,36 @@ export class ToggleGroupNode extends WidgetNode<Adw.ToggleGroup, ToggleGroupProp
24
46
  );
25
47
  }
26
48
  }
49
+
50
+ public override detachDeletedInstance(): void {
51
+ this.clearToggles();
52
+ super.detachDeletedInstance();
53
+ }
54
+
55
+ private syncToggles(newToggles: ToggleProps[]): void {
56
+ this.clearToggles();
57
+
58
+ for (const toggleProps of newToggles) {
59
+ const toggle = new Adw.Toggle();
60
+ applyToggleProps(toggle, toggleProps);
61
+ this.container.add(toggle);
62
+ this.managedToggles.push(toggle);
63
+ }
64
+ }
65
+
66
+ private clearToggles(): void {
67
+ for (const toggle of this.managedToggles) {
68
+ this.container.remove(toggle);
69
+ }
70
+ this.managedToggles = [];
71
+ }
72
+ }
73
+
74
+ function applyToggleProps(toggle: Adw.Toggle, props: ToggleProps): void {
75
+ if (props.id != null) toggle.setName(props.id);
76
+ if (props.label != null) toggle.setLabel(props.label);
77
+ if (props.iconName != null) toggle.setIconName(props.iconName);
78
+ if (props.tooltip !== undefined) toggle.setTooltip(props.tooltip);
79
+ if (props.enabled !== undefined) toggle.setEnabled(props.enabled);
80
+ if (props.useUnderline !== undefined) toggle.setUseUnderline(props.useUnderline);
27
81
  }
@@ -11,12 +11,11 @@ import {
11
11
  typeNameFromInstance,
12
12
  } from "@gtkx/ffi/gobject";
13
13
  import * as Gtk from "@gtkx/ffi/gtk";
14
- import { CONSTRUCTOR_PROPS } from "../generated/internal.js";
15
14
  import { isConstructOnlyProp, resolvePropMeta, resolveSignal } from "../metadata.js";
16
15
  import { Node } from "../node.js";
17
16
  import type { Container, Props } from "../types.js";
18
17
  import { applyAccessibleProps, isAccessibleProp } from "./internal/accessible.js";
19
- import { createContainerWithConstructOnly } from "./internal/construct.js";
18
+ import { createContainerWithProperties } from "./internal/construct.js";
20
19
  import {
21
20
  type InsertableWidget,
22
21
  isAddable,
@@ -56,15 +55,7 @@ export class WidgetNode<
56
55
  containerClass: typeof Gtk.Widget,
57
56
  _rootContainer?: Container,
58
57
  ): Container | null {
59
- const WidgetClass = containerClass;
60
- const typeName = WidgetClass.glibTypeName;
61
- const args = (CONSTRUCTOR_PROPS[typeName] ?? []).map((name) => props[name]);
62
-
63
- return createContainerWithConstructOnly(
64
- WidgetClass,
65
- props,
66
- () => new WidgetClass(...(args as ConstructorParameters<typeof Gtk.Widget>)),
67
- );
58
+ return createContainerWithProperties(containerClass, props);
68
59
  }
69
60
 
70
61
  public override isValidChild(_child: Node): boolean {
@@ -306,23 +297,16 @@ export class WidgetNode<
306
297
  }
307
298
 
308
299
  private setProperty(key: string, value: unknown): void {
309
- const propMeta = resolvePropMeta(this.container, key);
310
- if (!propMeta) return;
311
-
312
- const [getterName, setterName] = propMeta;
313
- const setter = this.container[setterName as keyof typeof this.container];
314
- if (!setter || typeof setter !== "function") return;
300
+ const propName = resolvePropMeta(this.container, key);
301
+ if (!propName) return;
315
302
 
316
- if (getterName && findProperty(this.container, key) instanceof ParamSpecString) {
317
- const getter = this.container[getterName as keyof typeof this.container];
303
+ const target = this.container as Record<string, unknown>;
318
304
 
319
- if (getter && typeof getter === "function") {
320
- const currentValue = getter.call(this.container);
321
- if (currentValue === value) return;
322
- }
305
+ if (findProperty(this.container, key) instanceof ParamSpecString) {
306
+ if (target[propName] === value) return;
323
307
  }
324
308
 
325
- setter.call(this.container, value);
309
+ target[propName] = value;
326
310
  }
327
311
 
328
312
  private insertBeforeReorderable(container: ReorderableWidget, child: WidgetNode, before: WidgetNode): void {
@@ -375,7 +359,11 @@ export class WidgetNode<
375
359
 
376
360
  function detachChildFromParent(child: WidgetNode): void {
377
361
  const currentParent = child.container.getParent();
378
- if (currentParent !== null && isRemovable(currentParent)) {
379
- currentParent.remove(child.container);
362
+ if (currentParent !== null) {
363
+ if (isRemovable(currentParent)) {
364
+ currentParent.remove(child.container);
365
+ } else {
366
+ child.container.unparent();
367
+ }
380
368
  }
381
369
  }
@@ -107,6 +107,7 @@ export class WindowNode extends WidgetNode<Gtk.Window, WindowProps, WindowChild>
107
107
 
108
108
  public override removeChild(child: WindowChild): void {
109
109
  if (child instanceof WindowNode) {
110
+ child.container.setVisible(false);
110
111
  child.container.setTransientFor(null);
111
112
  super.removeChild(child);
112
113
  return;
@@ -152,9 +153,8 @@ export class WindowNode extends WidgetNode<Gtk.Window, WindowProps, WindowChild>
152
153
  }
153
154
 
154
155
  public override detachDeletedInstance(): void {
155
- this.container.setVisible(false);
156
- this.container.destroy();
157
156
  super.detachDeletedInstance();
157
+ this.container.destroy();
158
158
  }
159
159
 
160
160
  private applyOwnProps(oldProps: WindowProps | null, newProps: WindowProps): void {
package/src/registry.ts CHANGED
@@ -5,26 +5,22 @@ import * as WebKit from "@gtkx/ffi/webkit";
5
5
  import type { Node } from "./node.js";
6
6
  import { AdjustableNode } from "./nodes/adjustable.js";
7
7
 
8
- import { AlertDialogResponseNode } from "./nodes/alert-dialog-response.js";
8
+ import { AlertDialogNode } from "./nodes/alert-dialog.js";
9
9
  import { AnimationNode } from "./nodes/animation.js";
10
10
  import { ApplicationNode } from "./nodes/application.js";
11
11
  import { CalendarNode } from "./nodes/calendar.js";
12
12
  import { ColorDialogButtonNode } from "./nodes/color-dialog-button.js";
13
- import { ColumnViewNode } from "./nodes/column-view.js";
14
13
  import { ColumnViewColumnNode } from "./nodes/column-view-column.js";
15
14
  import { ContainerSlotNode } from "./nodes/container-slot.js";
16
15
  import { DialogNode } from "./nodes/dialog.js";
17
16
  import { DrawingAreaNode } from "./nodes/drawing-area.js";
18
- import { DropDownNode } from "./nodes/drop-down.js";
19
17
  import { EventControllerNode } from "./nodes/event-controller.js";
20
18
  import { FixedChildNode } from "./nodes/fixed-child.js";
21
19
  import { FontDialogButtonNode } from "./nodes/font-dialog-button.js";
22
20
  import { GridChildNode } from "./nodes/grid-child.js";
23
- import { GridViewNode } from "./nodes/grid-view.js";
24
21
  import { LevelBarNode } from "./nodes/level-bar.js";
25
- import { ListItemNode } from "./nodes/list-item.js";
26
- import { ListSectionNode } from "./nodes/list-section.js";
27
- import { ListViewNode } from "./nodes/list-view.js";
22
+ import { ListNode } from "./nodes/list.js";
23
+ import { ListItemNode } from "./nodes/list-item-node.js";
28
24
  import { MenuNode } from "./nodes/menu.js";
29
25
  import { NavigationPageNode } from "./nodes/navigation-page.js";
30
26
  import { NavigationViewNode } from "./nodes/navigation-view.js";
@@ -39,14 +35,15 @@ import { SearchBarNode } from "./nodes/search-bar.js";
39
35
  import { ShortcutNode } from "./nodes/shortcut.js";
40
36
  import { SlotNode } from "./nodes/slot.js";
41
37
  import { SourceViewNode } from "./nodes/source-view.js";
38
+ import { SpinRowNode } from "./nodes/spin-row.js";
42
39
  import { StackNode } from "./nodes/stack.js";
43
40
  import { StackPageNode } from "./nodes/stack-page.js";
41
+ import { SwitchRowNode } from "./nodes/switch-row.js";
44
42
  import { TextAnchorNode } from "./nodes/text-anchor.js";
45
43
  import { TextPaintableNode } from "./nodes/text-paintable.js";
46
44
  import { TextSegmentNode } from "./nodes/text-segment.js";
47
45
  import { TextTagNode } from "./nodes/text-tag.js";
48
46
  import { TextViewNode } from "./nodes/text-view.js";
49
- import { ToggleNode } from "./nodes/toggle.js";
50
47
  import { ToggleGroupNode } from "./nodes/toggle-group.js";
51
48
  import { WebViewNode } from "./nodes/web-view.js";
52
49
  import { WidgetNode } from "./nodes/widget.js";
@@ -58,14 +55,16 @@ export type AdjustableWidget = InstanceType<(typeof AdjustableWidgets)[number]>;
58
55
  export const StackWidgets = [Gtk.Stack, Adw.ViewStack] as const;
59
56
  export type StackWidget = InstanceType<(typeof StackWidgets)[number]>;
60
57
 
61
- export const DropDownWidgets = [Gtk.DropDown, Adw.ComboRow] as const;
62
- export type DropDownWidget = InstanceType<(typeof DropDownWidgets)[number]>;
63
-
64
58
  export const PopoverMenuWidgets = [Gtk.PopoverMenu, Gtk.PopoverMenuBar, Gtk.MenuButton] as const;
65
59
  export type PopoverMenuWidget = InstanceType<(typeof PopoverMenuWidgets)[number]>;
66
60
 
67
- // biome-ignore lint/suspicious/noExplicitAny: Registry entries require flexible typing for varied node constructors
68
- export type NodeClass = (new (...args: any[]) => Node) & { createContainer(...args: any[]): unknown };
61
+ export type NodeClass = (new (
62
+ // biome-ignore lint/suspicious/noExplicitAny: Registry entries require flexible typing for varied node constructors
63
+ ...args: any[]
64
+ ) => Node) & {
65
+ // biome-ignore lint/suspicious/noExplicitAny: Registry entries require flexible typing for varied node constructors
66
+ createContainer(...args: any[]): unknown;
67
+ };
69
68
 
70
69
  // biome-ignore lint/suspicious/noExplicitAny: Class keys require flexible typing for GTK class hierarchy matching
71
70
  type ClassKey = new (...args: any[]) => any;
@@ -74,19 +73,15 @@ type NodeRegistryEntry = [RegistryKey, NodeClass];
74
73
 
75
74
  export const NODE_REGISTRY: NodeRegistryEntry[] = [
76
75
  ["ContainerSlot", ContainerSlotNode],
77
- ["AlertDialogResponse", AlertDialogResponseNode],
78
- ["Animation", AnimationNode],
76
+ [["AdwTimedAnimation", "AdwSpringAnimation"], AnimationNode],
79
77
  ["ColumnViewColumn", ColumnViewColumnNode],
80
78
  ["FixedChild", FixedChildNode],
81
79
  ["GridChild", GridChildNode],
82
- ["ListItem", ListItemNode],
83
- ["ListSection", ListSectionNode],
84
80
  [["MenuItem", "MenuSection", "MenuSubmenu"], MenuNode],
85
81
  ["NavigationPage", NavigationPageNode],
86
82
  ["NotebookPage", NotebookPageNode],
87
83
  ["NotebookPageTab", NotebookPageTabNode],
88
84
  ["OverlayChild", OverlayChildNode],
89
-
90
85
  ["Shortcut", ShortcutNode],
91
86
  ["Slot", SlotNode],
92
87
  ["StackPage", StackPageNode],
@@ -94,15 +89,16 @@ export const NODE_REGISTRY: NodeRegistryEntry[] = [
94
89
  ["TextPaintable", TextPaintableNode],
95
90
  ["TextSegment", TextSegmentNode],
96
91
  ["TextTag", TextTagNode],
97
- ["Toggle", ToggleNode],
98
92
  [Gtk.Application, ApplicationNode],
99
-
100
93
  [Gtk.EventController, EventControllerNode],
101
94
  [GtkSource.View, SourceViewNode],
102
95
  [Gtk.TextView, TextViewNode],
103
96
  [WebKit.WebView, WebViewNode],
97
+ [Adw.AlertDialog, AlertDialogNode],
104
98
  [Adw.Dialog, DialogNode],
105
99
  [Gtk.Window, WindowNode],
100
+ [Adw.SpinRow, SpinRowNode],
101
+ [Adw.SwitchRow, SwitchRowNode],
106
102
  [Gtk.Scale, ScaleNode],
107
103
  [Gtk.LevelBar, LevelBarNode],
108
104
  [Gtk.ScrolledWindow, ScrolledWindowNode],
@@ -115,11 +111,9 @@ export const NODE_REGISTRY: NodeRegistryEntry[] = [
115
111
  [Adw.ToggleGroup, ToggleGroupNode],
116
112
  [Gtk.Notebook, NotebookNode],
117
113
  [StackWidgets, StackNode],
118
- [Gtk.ColumnView, ColumnViewNode],
119
- [Gtk.ListView, ListViewNode],
120
- [Gtk.GridView, GridViewNode],
121
- [DropDownWidgets, DropDownNode],
114
+ [[Gtk.ListView, Gtk.ColumnView, Gtk.GridView, Gtk.DropDown, Adw.ComboRow], ListNode],
122
115
  [PopoverMenuWidgets, PopoverMenuNode],
123
116
  [AdjustableWidgets, AdjustableNode],
117
+ [[Gtk.ListItem, Gtk.ListHeader], ListItemNode],
124
118
  [Gtk.Widget, WidgetNode],
125
119
  ];
package/src/types.ts CHANGED
@@ -1,7 +1,13 @@
1
1
  import type * as Gtk from "@gtkx/ffi/gtk";
2
2
 
3
- export type Container = Gtk.Widget | Gtk.Application | Gtk.EventController;
3
+ /** @internal */
4
+ export type Container = Gtk.Widget | Gtk.Application | Gtk.EventController | Gtk.ListItem | Gtk.ListHeader;
4
5
 
5
6
  export type Props = Record<string, unknown>;
6
7
 
7
- export type ContainerClass = typeof Gtk.Widget | typeof Gtk.Application | typeof Gtk.EventController;
8
+ export type ContainerClass =
9
+ | typeof Gtk.Widget
10
+ | typeof Gtk.Application
11
+ | typeof Gtk.EventController
12
+ | typeof Gtk.ListItem
13
+ | typeof Gtk.ListHeader;