@gjsify/example-gtk-adwaita-storybook 0.53.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/browser-main.js +8093 -3042
  2. package/dist/gjs.js +15 -10
  3. package/dist/gjs.node.mjs +10 -5
  4. package/package.json +5 -5
  5. package/src/browser/buttons/color-dialog-button.web.ts +42 -0
  6. package/src/browser/buttons/font-dialog-button.web.ts +42 -0
  7. package/src/browser/buttons/link-button.web.ts +37 -0
  8. package/src/browser/buttons/scale-button.web.ts +36 -0
  9. package/src/browser/buttons/toggle-button.web.ts +35 -0
  10. package/src/browser/controls/check-button.web.ts +38 -0
  11. package/src/browser/controls/gtk-spinner.web.ts +39 -0
  12. package/src/browser/controls/level-bar.web.ts +43 -0
  13. package/src/browser/controls/password-entry.web.ts +36 -0
  14. package/src/browser/controls/progress-bar.web.ts +39 -0
  15. package/src/browser/controls/scale.web.ts +44 -0
  16. package/src/browser/controls/search-entry.web.ts +49 -0
  17. package/src/browser/controls/spin-button.web.ts +40 -0
  18. package/src/browser/controls/switch.web.ts +38 -0
  19. package/src/browser/drawing/drag-icon.web.ts +112 -0
  20. package/src/browser/drawing/drawing-area.web.ts +66 -0
  21. package/src/browser/drawing/gl-area.web.ts +162 -0
  22. package/src/browser/drawing/graphics-offload.web.ts +74 -0
  23. package/src/browser/feedback/dialog.web.ts +76 -0
  24. package/src/browser/feedback/emoji-chooser.web.ts +93 -0
  25. package/src/browser/feedback/gtk-about-dialog.web.ts +105 -0
  26. package/src/browser/feedback/page-setup-unix-dialog.web.ts +93 -0
  27. package/src/browser/feedback/print-unix-dialog.web.ts +111 -0
  28. package/src/browser/feedback/shortcuts-dialog.web.ts +90 -0
  29. package/src/browser/layout/application-window.web.ts +94 -0
  30. package/src/browser/layout/aspect-frame.web.ts +49 -0
  31. package/src/browser/layout/bin.web.ts +41 -0
  32. package/src/browser/layout/breakpoint-bin.web.ts +61 -0
  33. package/src/browser/layout/center-box.web.ts +45 -0
  34. package/src/browser/layout/clamp-scrollable.web.ts +47 -0
  35. package/src/browser/layout/expander.web.ts +52 -0
  36. package/src/browser/layout/fixed.web.ts +51 -0
  37. package/src/browser/layout/frame.web.ts +40 -0
  38. package/src/browser/layout/grid.web.ts +46 -0
  39. package/src/browser/layout/layout-slot.web.ts +60 -0
  40. package/src/browser/layout/multi-layout-view.web.ts +94 -0
  41. package/src/browser/layout/overlay.web.ts +57 -0
  42. package/src/browser/layout/paned.web.ts +69 -0
  43. package/src/browser/layout/popover-bin.web.ts +54 -0
  44. package/src/browser/layout/popover-menu.web.ts +48 -0
  45. package/src/browser/layout/popover.web.ts +61 -0
  46. package/src/browser/layout/revealer.web.ts +53 -0
  47. package/src/browser/layout/scrollbar.web.ts +54 -0
  48. package/src/browser/layout/scrolled-window.web.ts +52 -0
  49. package/src/browser/layout/separator.web.ts +47 -0
  50. package/src/browser/layout/viewport.web.ts +51 -0
  51. package/src/browser/layout/window.web.ts +60 -0
  52. package/src/browser/media/image.web.ts +39 -0
  53. package/src/browser/media/inscription.web.ts +52 -0
  54. package/src/browser/media/media-controls.web.ts +65 -0
  55. package/src/browser/media/picture.web.ts +56 -0
  56. package/src/browser/media/video.web.ts +56 -0
  57. package/src/browser/navigation/popover-menu-bar.web.ts +40 -0
  58. package/src/browser/presentation/calendar.web.ts +49 -0
  59. package/src/browser/presentation/column-view.web.ts +45 -0
  60. package/src/browser/presentation/flow-box.web.ts +52 -0
  61. package/src/browser/presentation/grid-view.web.ts +37 -0
  62. package/src/browser/presentation/list-box.web.ts +48 -0
  63. package/src/browser/presentation/list-view.web.ts +36 -0
  64. package/src/browser/presentation/tree-expander.web.ts +68 -0
  65. package/src/browser/presentation/window-handle.web.ts +42 -0
  66. package/src/browser/rows/preferences-row.web.ts +43 -0
  67. package/src/browser/stories.ts +158 -0
  68. package/src/browser/text/editable-label.web.ts +45 -0
  69. package/src/browser/text/search-bar.web.ts +45 -0
  70. package/src/browser/text/text-view.web.ts +54 -0
  71. package/src/browser/text/text.web.ts +48 -0
  72. package/src/browser/view-switching/notebook.web.ts +67 -0
  73. package/src/browser/view-switching/stack-sidebar.web.ts +68 -0
  74. package/src/browser/view-switching/stack-switcher.web.ts +70 -0
  75. package/src/browser/view-switching/stack.web.ts +72 -0
  76. package/src/browser/view-switching/tab-bar.web.ts +105 -0
  77. package/src/browser/view-switching/tab-button.web.ts +52 -0
  78. package/src/browser/view-switching/tab-overview.web.ts +87 -0
  79. package/src/browser/view-switching/view-switcher-sidebar.web.ts +77 -0
  80. package/src/browser/windows/action-bar.web.ts +66 -0
  81. package/src/browser/windows/gtk-application-window.web.ts +67 -0
  82. package/src/browser/windows/gtk-header-bar.web.ts +61 -0
  83. package/src/browser/windows/gtk-window.web.ts +58 -0
  84. package/src/browser/windows/window-controls.web.ts +54 -0
  85. package/src/buttons/color-dialog-button.meta.ts +16 -0
  86. package/src/buttons/color-dialog-button.story.ts +49 -0
  87. package/src/buttons/font-dialog-button.meta.ts +29 -0
  88. package/src/buttons/font-dialog-button.story.ts +52 -0
  89. package/src/buttons/link-button.meta.ts +18 -0
  90. package/src/buttons/link-button.story.ts +48 -0
  91. package/src/buttons/scale-button.meta.ts +34 -0
  92. package/src/buttons/scale-button.story.ts +50 -0
  93. package/src/buttons/toggle-button.meta.ts +17 -0
  94. package/src/buttons/toggle-button.story.ts +46 -0
  95. package/src/controls/check-button.meta.ts +19 -0
  96. package/src/controls/check-button.story.ts +56 -0
  97. package/src/controls/gtk-spinner.meta.ts +24 -0
  98. package/src/controls/gtk-spinner.story.ts +53 -0
  99. package/src/controls/level-bar.meta.ts +39 -0
  100. package/src/controls/level-bar.story.ts +58 -0
  101. package/src/controls/password-entry.meta.ts +18 -0
  102. package/src/controls/password-entry.story.ts +54 -0
  103. package/src/controls/progress-bar.meta.ts +20 -0
  104. package/src/controls/progress-bar.story.ts +53 -0
  105. package/src/controls/scale.meta.ts +47 -0
  106. package/src/controls/scale.story.ts +66 -0
  107. package/src/controls/search-entry.meta.ts +18 -0
  108. package/src/controls/search-entry.story.ts +57 -0
  109. package/src/controls/spin-button.meta.ts +40 -0
  110. package/src/controls/spin-button.story.ts +55 -0
  111. package/src/controls/switch.meta.ts +18 -0
  112. package/src/controls/switch.story.ts +50 -0
  113. package/src/drawing/drag-icon.meta.ts +39 -0
  114. package/src/drawing/drag-icon.story.ts +117 -0
  115. package/src/drawing/drawing-area.meta.ts +45 -0
  116. package/src/drawing/drawing-area.story.ts +78 -0
  117. package/src/drawing/gl-area.meta.ts +30 -0
  118. package/src/drawing/gl-area.story.ts +113 -0
  119. package/src/drawing/graphics-offload.meta.ts +39 -0
  120. package/src/drawing/graphics-offload.story.ts +73 -0
  121. package/src/feedback/dialog.meta.ts +25 -0
  122. package/src/feedback/dialog.story.ts +78 -0
  123. package/src/feedback/emoji-chooser.meta.ts +10 -0
  124. package/src/feedback/emoji-chooser.story.ts +98 -0
  125. package/src/feedback/gtk-about-dialog.meta.ts +29 -0
  126. package/src/feedback/gtk-about-dialog.story.ts +90 -0
  127. package/src/feedback/page-setup-unix-dialog.meta.ts +37 -0
  128. package/src/feedback/page-setup-unix-dialog.story.ts +70 -0
  129. package/src/feedback/print-unix-dialog.meta.ts +30 -0
  130. package/src/feedback/print-unix-dialog.story.ts +93 -0
  131. package/src/feedback/shortcuts-dialog.meta.ts +12 -0
  132. package/src/feedback/shortcuts-dialog.story.ts +79 -0
  133. package/src/layout/application-window.meta.ts +16 -0
  134. package/src/layout/application-window.story.ts +97 -0
  135. package/src/layout/aspect-frame.meta.ts +19 -0
  136. package/src/layout/aspect-frame.story.ts +62 -0
  137. package/src/layout/bin.meta.ts +15 -0
  138. package/src/layout/bin.story.ts +56 -0
  139. package/src/layout/breakpoint-bin.meta.ts +38 -0
  140. package/src/layout/breakpoint-bin.story.ts +62 -0
  141. package/src/layout/center-box.meta.ts +26 -0
  142. package/src/layout/center-box.story.ts +54 -0
  143. package/src/layout/clamp-scrollable.meta.ts +30 -0
  144. package/src/layout/clamp-scrollable.story.ts +51 -0
  145. package/src/layout/expander.meta.ts +30 -0
  146. package/src/layout/expander.story.ts +62 -0
  147. package/src/layout/fixed.meta.ts +16 -0
  148. package/src/layout/fixed.story.ts +54 -0
  149. package/src/layout/frame.meta.ts +24 -0
  150. package/src/layout/frame.story.ts +51 -0
  151. package/src/layout/grid.meta.ts +45 -0
  152. package/src/layout/grid.story.ts +80 -0
  153. package/src/layout/layout-slot.meta.ts +22 -0
  154. package/src/layout/layout-slot.story.ts +68 -0
  155. package/src/layout/multi-layout-view.meta.ts +31 -0
  156. package/src/layout/multi-layout-view.story.ts +101 -0
  157. package/src/layout/overlay.meta.ts +42 -0
  158. package/src/layout/overlay.story.ts +72 -0
  159. package/src/layout/paned.meta.ts +45 -0
  160. package/src/layout/paned.story.ts +70 -0
  161. package/src/layout/popover-bin.meta.ts +29 -0
  162. package/src/layout/popover-bin.story.ts +66 -0
  163. package/src/layout/popover-menu.meta.ts +54 -0
  164. package/src/layout/popover-menu.story.ts +119 -0
  165. package/src/layout/popover.meta.ts +38 -0
  166. package/src/layout/popover.story.ts +66 -0
  167. package/src/layout/revealer.meta.ts +44 -0
  168. package/src/layout/revealer.story.ts +79 -0
  169. package/src/layout/scrollbar.meta.ts +33 -0
  170. package/src/layout/scrollbar.story.ts +61 -0
  171. package/src/layout/scrolled-window.meta.ts +57 -0
  172. package/src/layout/scrolled-window.story.ts +74 -0
  173. package/src/layout/separator.meta.ts +25 -0
  174. package/src/layout/separator.story.ts +53 -0
  175. package/src/layout/viewport.meta.ts +19 -0
  176. package/src/layout/viewport.story.ts +53 -0
  177. package/src/layout/window.meta.ts +13 -0
  178. package/src/layout/window.story.ts +66 -0
  179. package/src/media/image.meta.ts +24 -0
  180. package/src/media/image.story.ts +48 -0
  181. package/src/media/inscription.meta.ts +45 -0
  182. package/src/media/inscription.story.ts +64 -0
  183. package/src/media/media-controls.meta.ts +30 -0
  184. package/src/media/media-controls.story.ts +58 -0
  185. package/src/media/picture.meta.ts +42 -0
  186. package/src/media/picture.story.ts +81 -0
  187. package/src/media/video.meta.ts +32 -0
  188. package/src/media/video.story.ts +57 -0
  189. package/src/metas.ts +79 -0
  190. package/src/navigation/popover-menu-bar.meta.ts +51 -0
  191. package/src/navigation/popover-menu-bar.story.ts +72 -0
  192. package/src/presentation/calendar.meta.ts +28 -0
  193. package/src/presentation/calendar.story.ts +64 -0
  194. package/src/presentation/column-view.meta.ts +30 -0
  195. package/src/presentation/column-view.story.ts +73 -0
  196. package/src/presentation/flow-box.meta.ts +51 -0
  197. package/src/presentation/flow-box.story.ts +72 -0
  198. package/src/presentation/grid-view.meta.ts +28 -0
  199. package/src/presentation/grid-view.story.ts +64 -0
  200. package/src/presentation/list-box.meta.ts +55 -0
  201. package/src/presentation/list-box.story.ts +68 -0
  202. package/src/presentation/list-view.meta.ts +38 -0
  203. package/src/presentation/list-view.story.ts +73 -0
  204. package/src/presentation/tree-expander.meta.ts +24 -0
  205. package/src/presentation/tree-expander.story.ts +105 -0
  206. package/src/presentation/window-handle.meta.ts +27 -0
  207. package/src/presentation/window-handle.story.ts +53 -0
  208. package/src/rows/preferences-row.meta.ts +15 -0
  209. package/src/rows/preferences-row.story.ts +50 -0
  210. package/src/text/editable-label.meta.ts +17 -0
  211. package/src/text/editable-label.story.ts +47 -0
  212. package/src/text/search-bar.meta.ts +17 -0
  213. package/src/text/search-bar.story.ts +48 -0
  214. package/src/text/text-view.meta.ts +49 -0
  215. package/src/text/text-view.story.ts +69 -0
  216. package/src/text/text.meta.ts +21 -0
  217. package/src/text/text.story.ts +50 -0
  218. package/src/view-switching/notebook.meta.ts +44 -0
  219. package/src/view-switching/notebook.story.ts +77 -0
  220. package/src/view-switching/stack-sidebar.meta.ts +50 -0
  221. package/src/view-switching/stack-sidebar.story.ts +85 -0
  222. package/src/view-switching/stack-switcher.meta.ts +53 -0
  223. package/src/view-switching/stack-switcher.story.ts +95 -0
  224. package/src/view-switching/stack.meta.ts +53 -0
  225. package/src/view-switching/stack.story.ts +95 -0
  226. package/src/view-switching/tab-bar.meta.ts +22 -0
  227. package/src/view-switching/tab-bar.story.ts +85 -0
  228. package/src/view-switching/tab-button.meta.ts +14 -0
  229. package/src/view-switching/tab-button.story.ts +52 -0
  230. package/src/view-switching/tab-overview.meta.ts +21 -0
  231. package/src/view-switching/tab-overview.story.ts +86 -0
  232. package/src/view-switching/view-switcher-sidebar.meta.ts +42 -0
  233. package/src/view-switching/view-switcher-sidebar.story.ts +73 -0
  234. package/src/windows/action-bar.meta.ts +27 -0
  235. package/src/windows/action-bar.story.ts +65 -0
  236. package/src/windows/gtk-application-window.meta.ts +27 -0
  237. package/src/windows/gtk-application-window.story.ts +89 -0
  238. package/src/windows/gtk-header-bar.meta.ts +39 -0
  239. package/src/windows/gtk-header-bar.story.ts +76 -0
  240. package/src/windows/gtk-window.meta.ts +30 -0
  241. package/src/windows/gtk-window.story.ts +64 -0
  242. package/src/windows/window-controls.meta.ts +42 -0
  243. package/src/windows/window-controls.story.ts +61 -0
@@ -0,0 +1,27 @@
1
+ // Shared, renderer-agnostic metadata for the GTK Application Window story. Imported by the GTK
2
+ // renderer (gtk-application-window.story.ts) and the browser renderer
3
+ // (browser/windows/gtk-application-window.web.ts), so both expose identical controls.
4
+ //
5
+ // The NAME is `gtk-application-window` and not `application-window` because
6
+ // `Adw.ApplicationWindow` holds that bare name on the adwaita/layout page, and the
7
+ // storybook keys every meta on its file name: a second `application-window.meta.ts`
8
+ // would silently displace one of the two. The block in /gjsify/gtk/windows/ is titled
9
+ // `Gtk.ApplicationWindow`, which `TITLED_AFTER` in
10
+ // `scripts/check-website-adwaita-gallery.mjs` maps onto this meta.
11
+
12
+ import { ControlType, type StoryMeta } from '@gjsify/stories';
13
+
14
+ export const gtkApplicationWindowMeta: StoryMeta = {
15
+ title: 'Windows/Application Window',
16
+ description:
17
+ 'Gtk.ApplicationWindow — a Gtk.Window that also handles an application menubar. The ' +
18
+ 'bar shows only when `show-menubar` is set AND the application HAS one: GTK builds it ' +
19
+ "from the GtkApplication's menu model, and reads the item count before deciding " +
20
+ '(gtkapplicationwindow.c:400-402). Everything else about the window is the base class.',
21
+ controls: [
22
+ { name: 'title', label: 'Title', type: ControlType.TEXT, defaultValue: 'Editor' },
23
+ { name: 'showMenubar', label: 'Show menubar', type: ControlType.BOOLEAN, defaultValue: true },
24
+ { name: 'hasMenubar', label: 'The application has one', type: ControlType.BOOLEAN, defaultValue: true },
25
+ { name: 'deletable', label: 'Deletable', type: ControlType.BOOLEAN, defaultValue: true },
26
+ ],
27
+ };
@@ -0,0 +1,89 @@
1
+ // Gtk.ApplicationWindow — a Gtk.Window with an application menubar, and the property that
2
+ // decides whether the bar is shown.
3
+ // original implementation.
4
+
5
+ import Gio from 'gi://Gio?version=2.0';
6
+ import Gtk from 'gi://Gtk?version=4.0';
7
+ import GObject from 'gi://GObject?version=2.0';
8
+ import { type StoryArgs, type StoryMeta, type StoryModule, StoryWidget } from '@gjsify/storybook';
9
+ import { gtkApplicationWindowMeta } from './gtk-application-window.meta.js';
10
+
11
+ /** The menu model the bar is built from — the thing no attribute can carry. */
12
+ function menubarModel(): Gio.Menu {
13
+ const menu = new Gio.Menu();
14
+ const file = new Gio.Menu();
15
+ file.append('_New', 'win.new');
16
+ file.append('_Open…', 'win.open');
17
+ const edit = new Gio.Menu();
18
+ edit.append('_Copy', 'win.copy');
19
+ edit.append('_Paste', 'win.paste');
20
+ menu.append_section(null, file);
21
+ menu.append_section(null, edit);
22
+ return menu;
23
+ }
24
+
25
+ /** Story: a Gtk.ApplicationWindow whose `show-menubar` and menu model are both driven by args. */
26
+ export class GtkApplicationWindowStory extends StoryWidget {
27
+ private _window: Gtk.ApplicationWindow | null = null;
28
+ private _application: Gtk.Application | null = null;
29
+ private _menubar: Gio.Menu | null = null;
30
+
31
+ static {
32
+ GObject.registerClass({ GTypeName: 'AdwStorybookGtkApplicationWindow' }, GtkApplicationWindowStory);
33
+ }
34
+
35
+ constructor() {
36
+ super(StoryWidget.fromMeta(GtkApplicationWindowStory.getMetadata(), 'Default'));
37
+ }
38
+
39
+ static getMetadata(): StoryMeta {
40
+ return { ...gtkApplicationWindowMeta, component: Gtk.ApplicationWindow.$gtype };
41
+ }
42
+
43
+ initialize(): void {
44
+ this._application = new Gtk.Application({ application_id: 'eu.jumplink.AdwStorybookGtkApplicationWindow' });
45
+ this._menubar = menubarModel();
46
+ // The bar reads the MENU MODEL off the application, never off the window
47
+ // (gtkapplicationwindow.c:337-348), so the story sets it on the application.
48
+ this._application.set_menubar(this._menubar);
49
+
50
+ this._window = new Gtk.ApplicationWindow({
51
+ application: this._application,
52
+ default_width: 460,
53
+ default_height: 260,
54
+ });
55
+ this._window.set_titlebar(new Gtk.HeaderBar());
56
+ const body = new Gtk.Box({
57
+ orientation: Gtk.Orientation.VERTICAL,
58
+ spacing: 12,
59
+ margin_top: 12,
60
+ margin_start: 12,
61
+ });
62
+ body.append(
63
+ new Gtk.Label({ label: 'The bar above is built from the application menu.', css_classes: ['dimmed'] }),
64
+ );
65
+ this._window.set_child(body);
66
+
67
+ this.addContent(this._window);
68
+ this._apply();
69
+ }
70
+
71
+ updateArgs(_args: StoryArgs): void {
72
+ this._apply();
73
+ }
74
+
75
+ private _apply(): void {
76
+ if (!this._window || !this._application) return;
77
+ this._window.title = this.args.title as string;
78
+ this._window.deletable = this.args.deletable as boolean;
79
+ // The second half of `update_menubar`'s rule (:400-402): a window with no menubar at
80
+ // all shows nothing, whatever `show-menubar` says. `set_menubar(null)` is the same
81
+ // "no model" state an application starts in.
82
+ this._application.set_menubar((this.args.hasMenubar as boolean) ? this._menubar : null);
83
+ this._window.show_menubar = this.args.showMenubar as boolean;
84
+ }
85
+ }
86
+
87
+ GObject.type_ensure(GtkApplicationWindowStory.$gtype);
88
+
89
+ export const GtkApplicationWindowStories: StoryModule = { stories: [GtkApplicationWindowStory] };
@@ -0,0 +1,39 @@
1
+ // Shared, renderer-agnostic metadata for the GTK Header Bar story. Imported by the GTK
2
+ // renderer (gtk-header-bar.story.ts) and the browser renderer
3
+ // (browser/windows/gtk-header-bar.web.ts), so both expose identical controls.
4
+
5
+ import { ControlType, type StoryMeta } from '@gjsify/stories';
6
+
7
+ export const gtkHeaderBarMeta: StoryMeta = {
8
+ title: 'Windows/Header Bar',
9
+ description:
10
+ 'Gtk.HeaderBar — the titlebar widget: children packed at the start and at the end, ' +
11
+ 'the window title in the middle, and the window-frame buttons GTK would otherwise ask ' +
12
+ 'the window manager for. `end` PREPENDS, so the first end child sits nearest the ' +
13
+ 'edge; a `title` child takes the middle away from the derived title label; and ' +
14
+ '`show-title-buttons` CREATES and REMOVES the two control groups rather than hiding them.',
15
+ controls: [
16
+ {
17
+ name: 'titleWidget',
18
+ label: 'Title widget',
19
+ type: ControlType.SELECT,
20
+ options: [
21
+ { label: 'The window title', value: 'none' },
22
+ { label: 'A custom centre widget', value: 'custom' },
23
+ ],
24
+ defaultValue: 'none',
25
+ },
26
+ { name: 'showTitleButtons', label: 'Title buttons', type: ControlType.BOOLEAN, defaultValue: true },
27
+ {
28
+ name: 'decorationLayout',
29
+ label: 'Decoration layout',
30
+ type: ControlType.SELECT,
31
+ options: [
32
+ { label: 'GNOME (menu:minimize,maximize,close)', value: 'menu:minimize,maximize,close' },
33
+ { label: 'Close only', value: ':close' },
34
+ { label: 'macOS (icon:minimize,maximize)', value: 'icon:minimize,maximize' },
35
+ ],
36
+ defaultValue: 'menu:minimize,maximize,close',
37
+ },
38
+ ],
39
+ };
@@ -0,0 +1,76 @@
1
+ // Gtk.HeaderBar — GTK's own titlebar widget, with its three children, its derived title
2
+ // label and the two window-control groups it creates.
3
+ // original implementation.
4
+
5
+ import Gtk from 'gi://Gtk?version=4.0';
6
+ import GObject from 'gi://GObject?version=2.0';
7
+ import { type StoryArgs, type StoryMeta, type StoryModule, StoryWidget } from '@gjsify/storybook';
8
+ import { gtkHeaderBarMeta } from './gtk-header-bar.meta.js';
9
+
10
+ /**
11
+ * Story: a Gtk.HeaderBar inside a Gtk.Window, with args driving layout and decorations.
12
+ *
13
+ * Named `GtkHeaderBarStory`, not `HeaderBarStory`, and the GType carries the same `Gtk`
14
+ * infix: GType names share ONE process-wide namespace, and
15
+ * `layout/header-bar.story.ts` (the Adw.HeaderBar) already owns `AdwStorybookHeaderBar`.
16
+ * Registering it twice throws `a GType named 'AdwStorybookHeaderBar' is already
17
+ * registered` the moment both story modules load — the storybook smoke proof, not a type
18
+ * error. Every sibling in this directory prefixes the same way (`GtkWindowStory`,
19
+ * `GtkApplicationWindowStory`).
20
+ */
21
+ export class GtkHeaderBarStory extends StoryWidget {
22
+ private _bar: Gtk.HeaderBar | null = null;
23
+ private _titleLabel: Gtk.Label | null = null;
24
+
25
+ static {
26
+ GObject.registerClass({ GTypeName: 'AdwStorybookGtkHeaderBar' }, GtkHeaderBarStory);
27
+ }
28
+
29
+ constructor() {
30
+ super(StoryWidget.fromMeta(GtkHeaderBarStory.getMetadata(), 'Default'));
31
+ }
32
+
33
+ static getMetadata(): StoryMeta {
34
+ return { ...gtkHeaderBarMeta, component: Gtk.HeaderBar.$gtype };
35
+ }
36
+
37
+ initialize(): void {
38
+ this._bar = new Gtk.HeaderBar();
39
+
40
+ // `pack_end` PREPENDS (gtkheaderbar.c:843-861), so the order below is the order the
41
+ // buttons read in from the edge inwards: search, then the primary menu.
42
+ const menu = new Gtk.Button({ icon_name: 'open-menu-symbolic' });
43
+ menu.add_css_class('flat');
44
+ this._bar.pack_end(menu);
45
+ const search = new Gtk.Button({ icon_name: 'system-search-symbolic' });
46
+ search.add_css_class('flat');
47
+ this._bar.pack_end(search);
48
+
49
+ const back = new Gtk.Button({ label: '‹' });
50
+ back.add_css_class('flat');
51
+ this._bar.pack_start(back);
52
+
53
+ this._titleLabel = new Gtk.Label({ label: 'Mailboxes', css_classes: ['title'] });
54
+
55
+ this.addContent(this._bar);
56
+ this._apply();
57
+ }
58
+
59
+ updateArgs(_args: StoryArgs): void {
60
+ this._apply();
61
+ }
62
+
63
+ private _apply(): void {
64
+ if (!this._bar) return;
65
+ this._bar.decoration_layout = this.args.decorationLayout as string;
66
+ this._bar.show_title_buttons = this.args.showTitleButtons as boolean;
67
+ // The either/or of `gtk_header_bar_set_title_widget` (gtkheaderbar.c:313-341): the
68
+ // centre bin goes empty for the widget, and NULL hands the derived label back.
69
+ if ((this.args.titleWidget as string) === 'custom') this._bar.title_widget = this._titleLabel;
70
+ else this._bar.title_widget = null;
71
+ }
72
+ }
73
+
74
+ GObject.type_ensure(GtkHeaderBarStory.$gtype);
75
+
76
+ export const GtkHeaderBarStories: StoryModule = { stories: [GtkHeaderBarStory] };
@@ -0,0 +1,30 @@
1
+ // Shared, renderer-agnostic metadata for the GTK Window story. Imported by the GTK
2
+ // renderer (gtk-window.story.ts) and the browser renderer
3
+ // (browser/windows/gtk-window.web.ts), so both expose identical controls.
4
+ //
5
+ // The NAME is `gtk-window` and not `window` because `Adw.Window` holds that bare name
6
+ // on the adwaita/layout page, and the storybook keys every meta on its file name: a
7
+ // second `window.meta.ts` would silently displace one of the two. The block in
8
+ // /gjsify/gtk/windows/ is titled `Gtk.Window`, which `TITLED_AFTER` in
9
+ // `scripts/check-website-adwaita-gallery.mjs` maps onto this meta.
10
+
11
+ import { ControlType, type StoryMeta } from '@gjsify/stories';
12
+
13
+ export const gtkWindowMeta: StoryMeta = {
14
+ title: 'Windows/Window',
15
+ description:
16
+ 'Gtk.Window — a toplevel with a `titlebar` and a `child`, and the properties that ' +
17
+ 'decide what its frame shows: `decorated`, `deletable`, `resizable`, `maximized` and ' +
18
+ '`hide-on-close`. The BROWSER replica of this one is an IN-PAGE FRAME, not a toplevel: ' +
19
+ 'a browser document has no window to map. The story therefore cancels `close-request`, ' +
20
+ 'which is what an application does when it wants to keep the window.',
21
+ controls: [
22
+ { name: 'title', label: 'Title', type: ControlType.TEXT, defaultValue: 'Documents' },
23
+ { name: 'decorated', label: 'Decorated', type: ControlType.BOOLEAN, defaultValue: true },
24
+ { name: 'deletable', label: 'Deletable', type: ControlType.BOOLEAN, defaultValue: true },
25
+ { name: 'resizable', label: 'Resizable', type: ControlType.BOOLEAN, defaultValue: true },
26
+ { name: 'maximized', label: 'Maximized', type: ControlType.BOOLEAN, defaultValue: false },
27
+ { name: 'modal', label: 'Modal', type: ControlType.BOOLEAN, defaultValue: false },
28
+ { name: 'hideOnClose', label: 'Hide on close', type: ControlType.BOOLEAN, defaultValue: true },
29
+ ],
30
+ };
@@ -0,0 +1,64 @@
1
+ // Gtk.Window — a toplevel, its titlebar, and the properties that decide what the frame shows.
2
+ // original implementation.
3
+
4
+ import Gtk from 'gi://Gtk?version=4.0';
5
+ import GObject from 'gi://GObject?version=2.0';
6
+ import { type StoryArgs, type StoryMeta, type StoryModule, StoryWidget } from '@gjsify/storybook';
7
+ import { gtkWindowMeta } from './gtk-window.meta.js';
8
+
9
+ /** Story: a real Gtk.Window whose frame properties are all driven by args. */
10
+ export class GtkWindowStory extends StoryWidget {
11
+ private _window: Gtk.Window | null = null;
12
+
13
+ static {
14
+ GObject.registerClass({ GTypeName: 'AdwStorybookGtkWindow' }, GtkWindowStory);
15
+ }
16
+
17
+ constructor() {
18
+ super(StoryWidget.fromMeta(GtkWindowStory.getMetadata(), 'Default'));
19
+ }
20
+
21
+ static getMetadata(): StoryMeta {
22
+ return { ...gtkWindowMeta, component: Gtk.Window.$gtype };
23
+ }
24
+
25
+ initialize(): void {
26
+ this._window = new Gtk.Window({ default_width: 460, default_height: 280 });
27
+
28
+ // `decorated: false` DROPS the titlebar outright (gtkwindow.c:1014), so the story
29
+ // keeps the bar in the TREE and lets the property decide whether it is seen.
30
+ const bar = new Gtk.HeaderBar();
31
+ this._window.set_titlebar(bar);
32
+
33
+ const body = new Gtk.Box({
34
+ orientation: Gtk.Orientation.VERTICAL,
35
+ spacing: 12,
36
+ margin_top: 12,
37
+ margin_start: 12,
38
+ });
39
+ body.append(new Gtk.Label({ label: 'The frame above is a Gtk.HeaderBar.', css_classes: ['dimmed'] }));
40
+ this._window.set_child(body);
41
+
42
+ this.addContent(this._window);
43
+ this._apply();
44
+ }
45
+
46
+ updateArgs(_args: StoryArgs): void {
47
+ this._apply();
48
+ }
49
+
50
+ private _apply(): void {
51
+ if (!this._window) return;
52
+ this._window.title = this.args.title as string;
53
+ this._window.decorated = this.args.decorated as boolean;
54
+ this._window.deletable = this.args.deletable as boolean;
55
+ this._window.resizable = this.args.resizable as boolean;
56
+ this._window.maximized = this.args.maximized as boolean;
57
+ this._window.modal = this.args.modal as boolean;
58
+ this._window.hide_on_close = this.args.hideOnClose as boolean;
59
+ }
60
+ }
61
+
62
+ GObject.type_ensure(GtkWindowStory.$gtype);
63
+
64
+ export const GtkWindowStories: StoryModule = { stories: [GtkWindowStory] };
@@ -0,0 +1,42 @@
1
+ // Shared, renderer-agnostic metadata for the Window Controls story. Imported by the GTK
2
+ // renderer (window-controls.story.ts) and the browser renderer
3
+ // (browser/windows/window-controls.web.ts), so both expose identical controls.
4
+
5
+ import { ControlType, type StoryMeta } from '@gjsify/stories';
6
+
7
+ export const windowControlsMeta: StoryMeta = {
8
+ title: 'Windows/Window Controls',
9
+ description:
10
+ 'Gtk.WindowControls — one SIDE of the window frame controls, and the decision table ' +
11
+ 'behind them. The decoration layout is split on the first colon; each token of the ' +
12
+ 'selected half builds one button or none, because `icon` and `minimize` want a ' +
13
+ 'SOVEREIGN window, `maximize` wants a resizable one and `close` wants a deletable one. ' +
14
+ '`empty` is the property that says none of them did.',
15
+ controls: [
16
+ {
17
+ name: 'side',
18
+ label: 'Side',
19
+ type: ControlType.SELECT,
20
+ options: [
21
+ { label: 'Start', value: 'start' },
22
+ { label: 'End', value: 'end' },
23
+ ],
24
+ defaultValue: 'start',
25
+ },
26
+ {
27
+ name: 'decorationLayout',
28
+ label: 'Decoration layout',
29
+ type: ControlType.SELECT,
30
+ options: [
31
+ { label: 'GNOME (menu:minimize,maximize,close)', value: 'menu:minimize,maximize,close' },
32
+ { label: 'Windows (icon:minimize,maximize,close)', value: 'icon:minimize,maximize,close' },
33
+ { label: 'Close only', value: ':close' },
34
+ { label: 'macOS (icon:minimize,maximize)', value: 'icon:minimize,maximize' },
35
+ ],
36
+ defaultValue: 'menu:minimize,maximize,close',
37
+ },
38
+ { name: 'resizable', label: 'Resizable window', type: ControlType.BOOLEAN, defaultValue: true },
39
+ { name: 'maximized', label: 'Maximized window', type: ControlType.BOOLEAN, defaultValue: false },
40
+ { name: 'modal', label: 'Modal window', type: ControlType.BOOLEAN, defaultValue: false },
41
+ ],
42
+ };
@@ -0,0 +1,61 @@
1
+ // Gtk.WindowControls — the frame buttons of ONE side, and the window properties each token
2
+ // reads. A Gtk.WindowControls outside a Gtk.Window draws NOTHING (gtkwindowcontrols.c:257-264),
3
+ // which is why this story is a window rather than a bare widget.
4
+ // original implementation.
5
+
6
+ import Gtk from 'gi://Gtk?version=4.0';
7
+ import GObject from 'gi://GObject?version=2.0';
8
+ import { type StoryArgs, type StoryMeta, type StoryModule, StoryWidget } from '@gjsify/storybook';
9
+ import { windowControlsMeta } from './window-controls.meta.js';
10
+
11
+ /** Story: a Gtk.WindowControls in the titlebar of a real Gtk.Window, driven by args. */
12
+ export class WindowControlsStory extends StoryWidget {
13
+ private _window: Gtk.Window | null = null;
14
+ private _controls: Gtk.WindowControls | null = null;
15
+
16
+ static {
17
+ GObject.registerClass({ GTypeName: 'AdwStorybookWindowControls' }, WindowControlsStory);
18
+ }
19
+
20
+ constructor() {
21
+ super(StoryWidget.fromMeta(WindowControlsStory.getMetadata(), 'Default'));
22
+ }
23
+
24
+ static getMetadata(): StoryMeta {
25
+ return { ...windowControlsMeta, component: Gtk.WindowControls.$gtype };
26
+ }
27
+
28
+ initialize(): void {
29
+ this._window = new Gtk.Window({ title: 'Documents', default_width: 420, default_height: 220 });
30
+ const box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, spacing: 8 });
31
+ box.append(new Gtk.Label({ label: 'The bar draws nothing outside a window.', css_classes: ['dimmed'] }));
32
+ this._window.set_child(box);
33
+
34
+ // A window with NO titlebar of its own, so the controls really are the titlebar —
35
+ // which is the shape `update_window_buttons` reads its four window properties for.
36
+ this._controls = new Gtk.WindowControls();
37
+ this._window.set_titlebar(this._controls);
38
+
39
+ this.addContent(this._window);
40
+ this._apply();
41
+ }
42
+
43
+ updateArgs(_args: StoryArgs): void {
44
+ this._apply();
45
+ }
46
+
47
+ private _apply(): void {
48
+ if (!this._window || !this._controls) return;
49
+ const side = (this.args.side as string) === 'end' ? Gtk.PackType.END : Gtk.PackType.START;
50
+ this._controls.side = side;
51
+ this._controls.decoration_layout = this.args.decorationLayout as string;
52
+ // `update_window_buttons` (:270-274) reads exactly these four off the root.
53
+ this._window.resizable = this.args.resizable as boolean;
54
+ this._window.maximized = this.args.maximized as boolean;
55
+ this._window.modal = this.args.modal as boolean;
56
+ }
57
+ }
58
+
59
+ GObject.type_ensure(WindowControlsStory.$gtype);
60
+
61
+ export const WindowControlsStories: StoryModule = { stories: [WindowControlsStory] };