@gjsify/example-gtk-adwaita-storybook 0.54.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 +8089 -3038
  2. package/dist/gjs.js +14 -9
  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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/example-gtk-adwaita-storybook",
3
- "version": "0.54.0",
3
+ "version": "0.55.0",
4
4
  "description": "Interactive component browser for Libadwaita widgets — a native Adwaita storybook built on @gjsify/storybook, debuggable over DBus/MCP via @gjsify/devtools",
5
5
  "type": "module",
6
6
  "main": "dist/gjs.js",
@@ -54,11 +54,11 @@
54
54
  "@girs/glib-2.0": "5.4.0",
55
55
  "@girs/gobject-2.0": "5.4.0",
56
56
  "@girs/gtk-4.0": "5.4.0",
57
- "@gjsify/adwaita-web": "^0.54.0",
58
- "@gjsify/cli": "^0.54.0",
57
+ "@gjsify/adwaita-web": "^0.55.0",
58
+ "@gjsify/cli": "^0.55.0",
59
59
  "@gjsify/node-gi": "file:../../../packages/node-gi/node-gi",
60
- "@gjsify/storybook": "^0.54.0",
61
- "@gjsify/adwaita-storybook": "^0.54.0",
60
+ "@gjsify/storybook": "^0.55.0",
61
+ "@gjsify/adwaita-storybook": "^0.55.0",
62
62
  "@types/node": "^25.9.2",
63
63
  "typescript": "^6.0.3"
64
64
  },
@@ -0,0 +1,42 @@
1
+ // Browser port of the Color Dialog Button story. Shares metadata with
2
+ // color-dialog-button.meta.ts.
3
+
4
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
5
+ import { colorDialogButtonMeta } from '../../buttons/color-dialog-button.meta.js';
6
+ import type { Gtk } from '@gjsify/adwaita-web';
7
+
8
+ export class ColorDialogButtonWebStory extends StoryElement {
9
+ private _button: Gtk.ColorDialogButton | null = null;
10
+
11
+ constructor() {
12
+ super(ColorDialogButtonWebStory.getMetadata(), 'Default');
13
+ }
14
+
15
+ static getMetadata(): StoryMeta {
16
+ return colorDialogButtonMeta;
17
+ }
18
+
19
+ initialize(): void {
20
+ this._button = document.createElement('gtk-color-dialog-button') as Gtk.ColorDialogButton;
21
+ // The `dialog` attribute is what makes the button sensitive: the element's rule is
22
+ // GTK's `dialog != NULL && cancellable == NULL`.
23
+ this._button.setAttribute('dialog', '');
24
+ this._apply();
25
+ this.addContent(this._button);
26
+ }
27
+
28
+ updateArgs(_args: StoryArgs): void {
29
+ this._apply();
30
+ }
31
+
32
+ private _apply(): void {
33
+ if (!this._button) return;
34
+ this._button.setAttribute('rgba', this.args.rgba as string);
35
+ // `title` is a property of the DIALOG, not of the button, so it goes through the
36
+ // dialog rather than an attribute the element does not observe.
37
+ const title = (this.args.title as string).trim();
38
+ this._button.dialog = { title: title === '' ? null : title };
39
+ }
40
+ }
41
+
42
+ export const ColorDialogButtonWebStories: WebStoryModule = { stories: [ColorDialogButtonWebStory] };
@@ -0,0 +1,42 @@
1
+ // Browser port of the Font Dialog Button story. Shares metadata with
2
+ // font-dialog-button.meta.ts.
3
+
4
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
5
+ import { fontDialogButtonMeta } from '../../buttons/font-dialog-button.meta.js';
6
+ import type { Gtk } from '@gjsify/adwaita-web';
7
+
8
+ export class FontDialogButtonWebStory extends StoryElement {
9
+ private _button: Gtk.FontDialogButton | null = null;
10
+
11
+ constructor() {
12
+ super(FontDialogButtonWebStory.getMetadata(), 'Default');
13
+ }
14
+
15
+ static getMetadata(): StoryMeta {
16
+ return fontDialogButtonMeta;
17
+ }
18
+
19
+ initialize(): void {
20
+ this._button = document.createElement('gtk-font-dialog-button') as Gtk.FontDialogButton;
21
+ // Without a dialog the button is insensitive, GTK's rule being
22
+ // `dialog != NULL && cancellable == NULL`.
23
+ this._button.setAttribute('dialog', '');
24
+ this._apply();
25
+ this.addContent(this._button);
26
+ }
27
+
28
+ updateArgs(_args: StoryArgs): void {
29
+ this._apply();
30
+ }
31
+
32
+ private _apply(): void {
33
+ if (!this._button) return;
34
+ // `level` first: it decides whether the size box is visible at all.
35
+ this._button.setAttribute('level', this.args.level as string);
36
+ this._button.setAttribute('font-desc', this.args.fontDesc as string);
37
+ this._button.toggleAttribute('use-font', this.args.useFont as boolean);
38
+ this._button.toggleAttribute('use-size', this.args.useSize as boolean);
39
+ }
40
+ }
41
+
42
+ export const FontDialogButtonWebStories: WebStoryModule = { stories: [FontDialogButtonWebStory] };
@@ -0,0 +1,37 @@
1
+ // Browser port of the Link Button story. Shares metadata with link-button.meta.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { linkButtonMeta } from '../../buttons/link-button.meta.js';
5
+
6
+ export class LinkButtonWebStory extends StoryElement {
7
+ private _button: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(LinkButtonWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return linkButtonMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._button = document.createElement('gtk-link-button');
19
+ this._apply();
20
+ this.addContent(this._button);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._button) return;
29
+ this._button.setAttribute('label', this.args.label as string);
30
+ // `uri` last, because the element unsets `visited` as its side effect — the other
31
+ // order would never show a visited link, exactly as on GTK.
32
+ this._button.setAttribute('uri', this.args.uri as string);
33
+ this._button.toggleAttribute('visited', this.args.visited as boolean);
34
+ }
35
+ }
36
+
37
+ export const LinkButtonWebStories: WebStoryModule = { stories: [LinkButtonWebStory] };
@@ -0,0 +1,36 @@
1
+ // Browser port of the Scale Button story. Shares metadata with scale-button.meta.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { scaleButtonMeta, SCALE_BUTTON_ICONS } from '../../buttons/scale-button.meta.js';
5
+
6
+ export class ScaleButtonWebStory extends StoryElement {
7
+ private _button: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ScaleButtonWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return scaleButtonMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._button = document.createElement('gtk-scale-button');
19
+ this._button.setAttribute('icons', JSON.stringify(SCALE_BUTTON_ICONS));
20
+ this._apply();
21
+ this.addContent(this._button);
22
+ }
23
+
24
+ updateArgs(_args: StoryArgs): void {
25
+ this._apply();
26
+ }
27
+
28
+ private _apply(): void {
29
+ if (!this._button) return;
30
+ this._button.setAttribute('orientation', this.args.orientation as string);
31
+ this._button.toggleAttribute('has-frame', this.args.hasFrame as boolean);
32
+ this._button.setAttribute('value', String(this.args.value));
33
+ }
34
+ }
35
+
36
+ export const ScaleButtonWebStories: WebStoryModule = { stories: [ScaleButtonWebStory] };
@@ -0,0 +1,35 @@
1
+ // Browser port of the Toggle Button story. Shares metadata with toggle-button.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { toggleButtonMeta } from '../../buttons/toggle-button.meta.js';
5
+
6
+ export class ToggleButtonWebStory extends StoryElement {
7
+ private _button: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ToggleButtonWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return toggleButtonMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._button = document.createElement('gtk-toggle-button');
19
+ this._apply();
20
+ this.addContent(this._button);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._button) return;
29
+ this._button.setAttribute('label', this.args.label as string);
30
+ this._button.toggleAttribute('active', this.args.active as boolean);
31
+ this._button.toggleAttribute('flat', this.args.flat as boolean);
32
+ }
33
+ }
34
+
35
+ export const ToggleButtonWebStories: WebStoryModule = { stories: [ToggleButtonWebStory] };
@@ -0,0 +1,38 @@
1
+ // Browser port of the Check Button story. Shares metadata with check-button.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { checkButtonMeta } from '../../controls/check-button.meta.js';
5
+
6
+ export class CheckButtonWebStory extends StoryElement {
7
+ private _button: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(CheckButtonWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return checkButtonMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._button = document.createElement('gtk-check-button');
19
+ this._apply();
20
+ this.addContent(this._button);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._button) return;
29
+ this._button.setAttribute('label', this.args.label as string);
30
+ // `checked` and `indeterminate`, not GtkCheckButton's `active` / `inconsistent`:
31
+ // the element wraps a real `<input>` and the stylesheet selects on these two.
32
+ this._button.toggleAttribute('checked', this.args.checked as boolean);
33
+ this._button.toggleAttribute('indeterminate', this.args.indeterminate as boolean);
34
+ this._button.toggleAttribute('disabled', this.args.disabled as boolean);
35
+ }
36
+ }
37
+
38
+ export const CheckButtonWebStories: WebStoryModule = { stories: [CheckButtonWebStory] };
@@ -0,0 +1,39 @@
1
+ // Browser port of the GTK Spinner story. Shares metadata with gtk-spinner.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { gtkSpinnerMeta } from '../../controls/gtk-spinner.meta.js';
5
+
6
+ export class GtkSpinnerWebStory extends StoryElement {
7
+ private _spinner: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(GtkSpinnerWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return gtkSpinnerMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._spinner = document.createElement('gtk-spinner');
19
+ this._apply();
20
+ this.addContent(this._spinner);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._spinner) return;
29
+ // `GtkSpinner` has no size property either; a box is what sizes it (gtkspinner.c:110-123).
30
+ const size = String(this.args.size as number);
31
+ this._spinner.style.width = `${size}px`;
32
+ this._spinner.style.height = `${size}px`;
33
+ if (this.args.spinning as boolean) (this._spinner as HTMLElement & { start(): void }).start();
34
+ else (this._spinner as HTMLElement & { stop(): void }).stop();
35
+ this._spinner.toggleAttribute('disabled', this.args.disabled as boolean);
36
+ }
37
+ }
38
+
39
+ export const GtkSpinnerWebStories: WebStoryModule = { stories: [GtkSpinnerWebStory] };
@@ -0,0 +1,43 @@
1
+ // Browser port of the Level Bar story. Shares metadata with level-bar.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { levelBarMeta } from '../../controls/level-bar.meta.js';
5
+
6
+ export class LevelBarWebStory extends StoryElement {
7
+ private _bar: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(LevelBarWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return levelBarMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._bar = document.createElement('gtk-level-bar');
19
+ this._apply();
20
+ this.addContent(this._bar);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._bar) return;
29
+ const vertical = this.args.orientation === 'vertical';
30
+ this._bar.setAttribute('orientation', vertical ? 'vertical' : 'horizontal');
31
+ // A horizontal bar fills the width it is given and a vertical one the height; the
32
+ // stylesheet takes the cross-axis from the orientation, so only the axis needs one.
33
+ this._bar.style.width = vertical ? '' : '200px';
34
+ this._bar.style.height = vertical ? '120px' : '';
35
+ // A new `max-value` drags `value` down with it, so it goes first (gtklevelbar.c:1229).
36
+ this._bar.setAttribute('max-value', String(this.args.maxValue as number));
37
+ this._bar.setAttribute('mode', this.args.mode as string);
38
+ this._bar.setAttribute('value', String(this.args.value as number));
39
+ this._bar.toggleAttribute('inverted', this.args.inverted as boolean);
40
+ }
41
+ }
42
+
43
+ export const LevelBarWebStories: WebStoryModule = { stories: [LevelBarWebStory] };
@@ -0,0 +1,36 @@
1
+ // Browser port of the Password Entry story. Shares metadata with password-entry.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { passwordEntryMeta } from '../../controls/password-entry.meta.js';
5
+
6
+ export class PasswordEntryWebStory extends StoryElement {
7
+ private _entry: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(PasswordEntryWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return passwordEntryMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._entry = document.createElement('gtk-password-entry');
19
+ this._entry.style.minWidth = '240px';
20
+ this._apply();
21
+ this.addContent(this._entry);
22
+ }
23
+
24
+ updateArgs(_args: StoryArgs): void {
25
+ this._apply();
26
+ }
27
+
28
+ private _apply(): void {
29
+ if (!this._entry) return;
30
+ this._entry.toggleAttribute('show-peek-icon', this.args.showPeekIcon as boolean);
31
+ this._entry.setAttribute('placeholder', this.args.placeholderText as string);
32
+ this._entry.toggleAttribute('disabled', this.args.disabled as boolean);
33
+ }
34
+ }
35
+
36
+ export const PasswordEntryWebStories: WebStoryModule = { stories: [PasswordEntryWebStory] };
@@ -0,0 +1,39 @@
1
+ // Browser port of the Progress Bar story. Shares metadata with progress-bar.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { progressBarMeta } from '../../controls/progress-bar.meta.js';
5
+
6
+ export class ProgressBarWebStory extends StoryElement {
7
+ private _bar: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ProgressBarWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return progressBarMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._bar = document.createElement('gtk-progress-bar');
19
+ this._apply();
20
+ this.addContent(this._bar);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._bar) return;
29
+ // GTK's own order: `set_fraction` leaves activity mode and `pulse()` enters it, so
30
+ // `pulsing` is what decides (gtkprogressbar.c:791, :845).
31
+ this._bar.toggleAttribute('pulsing', this.args.pulsing as boolean);
32
+ this._bar.setAttribute('fraction', String(this.args.fraction as number));
33
+ this._bar.toggleAttribute('show-text', this.args.showText as boolean);
34
+ this._bar.toggleAttribute('inverted', this.args.inverted as boolean);
35
+ this._bar.toggleAttribute('osd', this.args.osd as boolean);
36
+ }
37
+ }
38
+
39
+ export const ProgressBarWebStories: WebStoryModule = { stories: [ProgressBarWebStory] };
@@ -0,0 +1,44 @@
1
+ // Browser port of the Scale story. Shares metadata with scale.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { scaleMeta } from '../../controls/scale.meta.js';
5
+
6
+ export class ScaleWebStory extends StoryElement {
7
+ private _scale: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ScaleWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return scaleMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._scale = document.createElement('gtk-scale');
19
+ this._scale.style.width = '260px';
20
+ this._apply();
21
+ this.addContent(this._scale);
22
+ }
23
+
24
+ updateArgs(_args: StoryArgs): void {
25
+ this._apply();
26
+ }
27
+
28
+ private _apply(): void {
29
+ if (!this._scale) return;
30
+ this._scale.setAttribute('orientation', this.args.orientation as string);
31
+ this._scale.setAttribute('value-pos', this.args.valuePos as string);
32
+ this._scale.toggleAttribute('draw-value', this.args.drawValue as boolean);
33
+ this._scale.setAttribute('digits', String(this.args.digits as number));
34
+ this._scale.toggleAttribute('inverted', this.args.inverted as boolean);
35
+ // `has-origin` is TRUE by default, so it is the absence of the attribute that
36
+ // withdraws the highlight — the same inversion `GtkPasswordEntry.revealed` uses.
37
+ if (this.args.hasOrigin as boolean) this._scale.removeAttribute('has-origin');
38
+ else this._scale.setAttribute('has-origin', 'false');
39
+ this._scale.setAttribute('adjustment', '{"lower":0,"upper":100,"stepIncrement":1,"pageIncrement":10}');
40
+ this._scale.setAttribute('value', String(this.args.value as number));
41
+ }
42
+ }
43
+
44
+ export const ScaleWebStories: WebStoryModule = { stories: [ScaleWebStory] };
@@ -0,0 +1,49 @@
1
+ // Browser port of the Search Entry story. Shares metadata with search-entry.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { searchEntryMeta } from '../../controls/search-entry.meta.js';
5
+
6
+ export class SearchEntryWebStory extends StoryElement {
7
+ private _entry: HTMLElement | null = null;
8
+ private _label: HTMLElement | null = null;
9
+
10
+ constructor() {
11
+ super(SearchEntryWebStory.getMetadata(), 'Default');
12
+ }
13
+
14
+ static getMetadata(): StoryMeta {
15
+ return searchEntryMeta;
16
+ }
17
+
18
+ initialize(): void {
19
+ this._entry = document.createElement('gtk-search-entry');
20
+ this._entry.style.minWidth = '260px';
21
+ this._label = document.createElement('gtk-label');
22
+ this._label.className = 'dimmed';
23
+ this._label.textContent = 'search-changed has not fired yet';
24
+ this._entry.addEventListener('search-changed', (event) => {
25
+ const { value } = (event as CustomEvent).detail as { value: string };
26
+ if (this._label) this._label.textContent = `search-changed: "${value}"`;
27
+ });
28
+ this._apply();
29
+ const box = document.createElement('div');
30
+ box.style.display = 'flex';
31
+ box.style.flexDirection = 'column';
32
+ box.style.gap = '12px';
33
+ box.append(this._entry, this._label);
34
+ this.addContent(box);
35
+ }
36
+
37
+ updateArgs(_args: StoryArgs): void {
38
+ this._apply();
39
+ }
40
+
41
+ private _apply(): void {
42
+ if (!this._entry) return;
43
+ this._entry.setAttribute('search-delay', String(this.args.searchDelay as number));
44
+ this._entry.setAttribute('placeholder', this.args.placeholderText as string);
45
+ this._entry.toggleAttribute('disabled', this.args.disabled as boolean);
46
+ }
47
+ }
48
+
49
+ export const SearchEntryWebStories: WebStoryModule = { stories: [SearchEntryWebStory] };
@@ -0,0 +1,40 @@
1
+ // Browser port of the Spin Button story. Shares metadata with spin-button.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { spinButtonMeta } from '../../controls/spin-button.meta.js';
5
+
6
+ export class SpinButtonWebStory extends StoryElement {
7
+ private _spin: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(SpinButtonWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return spinButtonMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._spin = document.createElement('gtk-spin-button');
19
+ this._apply();
20
+ this.addContent(this._spin);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._spin) return;
29
+ this._spin.setAttribute('orientation', this.args.orientation as string);
30
+ this._spin.setAttribute('digits', String(this.args.digits as number));
31
+ this._spin.toggleAttribute('numeric', this.args.numeric as boolean);
32
+ this._spin.toggleAttribute('snap-to-ticks', this.args.snapToTicks as boolean);
33
+ this._spin.toggleAttribute('wrap', this.args.wrap as boolean);
34
+ this._spin.setAttribute('update-policy', this.args.updatePolicy as string);
35
+ this._spin.setAttribute('adjustment', '{"lower":0,"upper":10,"stepIncrement":1,"pageIncrement":2}');
36
+ this._spin.setAttribute('value', String(this.args.value as number));
37
+ }
38
+ }
39
+
40
+ export const SpinButtonWebStories: WebStoryModule = { stories: [SpinButtonWebStory] };
@@ -0,0 +1,38 @@
1
+ // Browser port of the Switch story. Shares metadata with switch.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { switchMeta } from '../../controls/switch.meta.js';
5
+
6
+ export class SwitchWebStory extends StoryElement {
7
+ private _switch: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(SwitchWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return switchMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._switch = document.createElement('gtk-switch');
19
+ this._apply();
20
+ this.addContent(this._switch);
21
+ }
22
+
23
+ updateArgs(_args: StoryArgs): void {
24
+ this._apply();
25
+ }
26
+
27
+ private _apply(): void {
28
+ if (!this._switch) return;
29
+ // `active` first: the element's setter writes `state` too, which is the default
30
+ // `::state-set` handler, and a `state` written afterwards is the application's
31
+ // half of the delayed change (gtkswitch.c:558, :637-654).
32
+ this._switch.toggleAttribute('active', this.args.active as boolean);
33
+ this._switch.toggleAttribute('state', this.args.state as boolean);
34
+ this._switch.toggleAttribute('disabled', this.args.disabled as boolean);
35
+ }
36
+ }
37
+
38
+ export const SwitchWebStories: WebStoryModule = { stories: [SwitchWebStory] };