@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
@@ -0,0 +1,40 @@
1
+ // Browser port of the Popover Menu Bar story. Shares metadata with
2
+ // popover-menu-bar.story.ts.
3
+
4
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
5
+ import { POPOVER_MENU_BAR_ITEMS, popoverMenuBarMeta } from '../../navigation/popover-menu-bar.meta.js';
6
+
7
+ export class PopoverMenuBarWebStory extends StoryElement {
8
+ private _bar!: HTMLElement;
9
+
10
+ constructor() {
11
+ super(PopoverMenuBarWebStory.getMetadata(), 'Default');
12
+ }
13
+
14
+ static getMetadata(): StoryMeta {
15
+ return popoverMenuBarMeta;
16
+ }
17
+
18
+ initialize(): void {
19
+ this._bar = document.createElement('gtk-popover-menu-bar');
20
+ this._apply();
21
+ this.addContent(this._bar);
22
+ }
23
+
24
+ updateArgs(_args: StoryArgs): void {
25
+ this._apply();
26
+ }
27
+
28
+ private _apply(): void {
29
+ if (!this._bar) return;
30
+ const entries = this.args.showLast === false ? POPOVER_MENU_BAR_ITEMS.slice(0, 3) : POPOVER_MENU_BAR_ITEMS;
31
+ this._bar.setAttribute('menu-model', JSON.stringify(entries));
32
+ // `position` reaches each item's popover, exactly as the GTK story walks the bar's
33
+ // children — the popovers are the bar's, not the bar's own placement.
34
+ for (const popover of this._bar.querySelectorAll('gtk-popover-menu')) {
35
+ popover.setAttribute('position', this.args.position as string);
36
+ }
37
+ }
38
+ }
39
+
40
+ export const PopoverMenuBarWebStories: WebStoryModule = { stories: [PopoverMenuBarWebStory] };
@@ -0,0 +1,49 @@
1
+ // Browser port of the Calendar story. Shares metadata with calendar.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { CALENDAR_STORY_DATE, CALENDAR_STORY_MARKS, calendarMeta } from '../../presentation/calendar.meta.js';
5
+
6
+ export class CalendarWebStory extends StoryElement {
7
+ private _calendar: HTMLElement | null = null;
8
+ private _marked = false;
9
+
10
+ constructor() {
11
+ super(CalendarWebStory.getMetadata(), 'Default');
12
+ }
13
+
14
+ static getMetadata(): StoryMeta {
15
+ return calendarMeta;
16
+ }
17
+
18
+ initialize(): void {
19
+ this._calendar = document.createElement('gtk-calendar');
20
+ // The ISO form `GDateTime` serialises to, which is what the element's `date` door
21
+ // reads — so the GTK story's GDateTime and this string are the same write.
22
+ this._calendar.setAttribute('date', CALENDAR_STORY_DATE);
23
+ this._apply();
24
+ this.addContent(this._calendar);
25
+ }
26
+
27
+ updateArgs(_args: StoryArgs): void {
28
+ this._apply();
29
+ }
30
+
31
+ private _apply(): void {
32
+ if (!this._calendar) return;
33
+ // Two of the three default TRUE and one defaults FALSE (gtkcalendar.c:440-460), so
34
+ // all three are written as explicit values.
35
+ this._calendar.setAttribute('show-heading', String(this.args.showHeading as boolean));
36
+ this._calendar.setAttribute('show-day-names', String(this.args.showDayNames as boolean));
37
+ this._calendar.toggleAttribute('show-week-numbers', this.args.showWeekNumbers as boolean);
38
+
39
+ const calendar = this._calendar as HTMLElement & {
40
+ markDay(day: number): void;
41
+ clearMarks(): void;
42
+ };
43
+ if (this._marked) calendar.clearMarks();
44
+ for (const day of CALENDAR_STORY_MARKS) calendar.markDay(day);
45
+ this._marked = true;
46
+ }
47
+ }
48
+
49
+ export const CalendarWebStories: WebStoryModule = { stories: [CalendarWebStory] };
@@ -0,0 +1,45 @@
1
+ // Browser port of the Column View story. Shares metadata with column-view.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { COLUMN_VIEW_ITEMS, columnViewMeta } from '../../presentation/column-view.meta.js';
5
+
6
+ export class ColumnViewWebStory extends StoryElement {
7
+ private _view: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ColumnViewWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return columnViewMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._view = document.createElement('gtk-column-view');
19
+ this._view.setAttribute('model', JSON.stringify(COLUMN_VIEW_ITEMS));
20
+ // The same two fields the GTK story gives its two column factories: the label and
21
+ // the id beside it.
22
+ this._view.setAttribute(
23
+ 'columns',
24
+ JSON.stringify([
25
+ { key: 'label', id: 'name', title: 'Name', expand: true, sortable: true },
26
+ { key: 'value', id: 'code', title: 'Code' },
27
+ ]),
28
+ );
29
+ this._apply();
30
+ this.addContent(this._view);
31
+ }
32
+
33
+ updateArgs(_args: StoryArgs): void {
34
+ this._apply();
35
+ }
36
+
37
+ private _apply(): void {
38
+ if (!this._view) return;
39
+ this._view.toggleAttribute('show-row-separators', this.args.showRowSeparators as boolean);
40
+ this._view.toggleAttribute('show-column-separators', this.args.showColumnSeparators as boolean);
41
+ this._view.toggleAttribute('reorderable', this.args.reorderable as boolean);
42
+ }
43
+ }
44
+
45
+ export const ColumnViewWebStories: WebStoryModule = { stories: [ColumnViewWebStory] };
@@ -0,0 +1,52 @@
1
+ // Browser port of the Flow Box story. Shares metadata with flow-box.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { FLOW_BOX_CELLS, flowBoxMeta } from '../../presentation/flow-box.meta.js';
5
+
6
+ export class FlowBoxWebStory extends StoryElement {
7
+ private _box: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(FlowBoxWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return flowBoxMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._box = document.createElement('gtk-flow-box');
19
+ this._box.style.width = '100%';
20
+ for (const name of FLOW_BOX_CELLS) {
21
+ const cell = document.createElement('gtk-flow-box-child');
22
+ const label = document.createElement('gtk-label');
23
+ label.setAttribute('label', name);
24
+ cell.appendChild(label);
25
+ this._box.appendChild(cell);
26
+ }
27
+ this._apply();
28
+ this.addContent(this._box);
29
+ }
30
+
31
+ updateArgs(_args: StoryArgs): void {
32
+ this._apply();
33
+ }
34
+
35
+ private _apply(): void {
36
+ if (!this._box) return;
37
+ this._box.setAttribute('selection-mode', this.args.selectionMode as string);
38
+ // HORIZONTAL is the default here, so `horizontal` is the bare attribute's meaning and
39
+ // only the vertical arg has to write.
40
+ this._box.setAttribute('orientation', this.args.orientation as string);
41
+ // Clamped to the ParamSpec minimum of 1 (gtkflowbox.c:3767-3770), the same clamp the
42
+ // setter applies to a 0.
43
+ this._box.setAttribute(
44
+ 'max-children-per-line',
45
+ String(Math.max(1, Math.trunc(this.args.maxChildrenPerLine as number))),
46
+ );
47
+ this._box.toggleAttribute('homogeneous', this.args.homogeneous as boolean);
48
+ this._box.setAttribute('row-spacing', String(Math.max(0, Math.trunc(this.args.rowSpacing as number))));
49
+ }
50
+ }
51
+
52
+ export const FlowBoxWebStories: WebStoryModule = { stories: [FlowBoxWebStory] };
@@ -0,0 +1,37 @@
1
+ // Browser port of the Grid View story. Shares metadata with grid-view.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { GRID_VIEW_ITEMS, gridViewMeta } from '../../presentation/grid-view.meta.js';
5
+
6
+ export class GridViewWebStory extends StoryElement {
7
+ private _view: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(GridViewWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return gridViewMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._view = document.createElement('gtk-grid-view');
19
+ this._view.setAttribute('model', JSON.stringify(GRID_VIEW_ITEMS));
20
+ this._apply();
21
+ this.addContent(this._view);
22
+ }
23
+
24
+ updateArgs(_args: StoryArgs): void {
25
+ this._apply();
26
+ }
27
+
28
+ private _apply(): void {
29
+ if (!this._view) return;
30
+ const min = Math.max(1, this.args.minColumns as number);
31
+ this._view.setAttribute('min-columns', String(min));
32
+ this._view.setAttribute('max-columns', String(Math.max(min, this.args.maxColumns as number)));
33
+ this._view.setAttribute('selection-mode', this.args.selectionMode as string);
34
+ }
35
+ }
36
+
37
+ export const GridViewWebStories: WebStoryModule = { stories: [GridViewWebStory] };
@@ -0,0 +1,48 @@
1
+ // Browser port of the List Box story. Shares metadata with list-box.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { LIST_BOX_ROWS, listBoxMeta } from '../../presentation/list-box.meta.js';
5
+
6
+ export class ListBoxWebStory extends StoryElement {
7
+ private _box: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ListBoxWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return listBoxMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._box = document.createElement('gtk-list-box');
19
+ this._box.style.width = '100%';
20
+ // The rows GTK would WRAP around each appended child are the rows here, which is
21
+ // the one thing the markup form has to spell.
22
+ for (const title of LIST_BOX_ROWS) {
23
+ const row = document.createElement('gtk-list-box-row');
24
+ const label = document.createElement('gtk-label');
25
+ label.setAttribute('label', title);
26
+ row.appendChild(label);
27
+ this._box.appendChild(row);
28
+ }
29
+ this._apply();
30
+ this.addContent(this._box);
31
+ }
32
+
33
+ updateArgs(_args: StoryArgs): void {
34
+ this._apply();
35
+ }
36
+
37
+ private _apply(): void {
38
+ if (!this._box) return;
39
+ this._box.setAttribute('selection-mode', this.args.selectionMode as string);
40
+ this._box.toggleAttribute('show-separators', this.args.showSeparators as boolean);
41
+ // `activate-on-single-click` defaults TRUE, so the bare attribute is the default and
42
+ // `="false"` is how a story asks for a double click.
43
+ this._box.setAttribute('activate-on-single-click', String(this.args.activateOnSingleClick as boolean));
44
+ this._box.setAttribute('tab-behavior', this.args.tabBehavior as string);
45
+ }
46
+ }
47
+
48
+ export const ListBoxWebStories: WebStoryModule = { stories: [ListBoxWebStory] };
@@ -0,0 +1,36 @@
1
+ // Browser port of the List View story. Shares metadata with list-view.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { LIST_VIEW_ITEMS, listViewMeta } from '../../presentation/list-view.meta.js';
5
+
6
+ export class ListViewWebStory extends StoryElement {
7
+ private _view: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(ListViewWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return listViewMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._view = document.createElement('gtk-list-view');
19
+ this._view.setAttribute('model', JSON.stringify(LIST_VIEW_ITEMS));
20
+ this._apply();
21
+ this.addContent(this._view);
22
+ }
23
+
24
+ updateArgs(_args: StoryArgs): void {
25
+ this._apply();
26
+ }
27
+
28
+ private _apply(): void {
29
+ if (!this._view) return;
30
+ this._view.setAttribute('selection-mode', this.args.selectionMode as string);
31
+ this._view.toggleAttribute('show-separators', this.args.showSeparators as boolean);
32
+ this._view.toggleAttribute('single-click-activate', this.args.singleClickActivate as boolean);
33
+ }
34
+ }
35
+
36
+ export const ListViewWebStories: WebStoryModule = { stories: [ListViewWebStory] };
@@ -0,0 +1,68 @@
1
+ // Browser port of the Tree Expander story. Shares metadata with tree-expander.story.ts.
2
+ //
3
+ // The GTK rendering gets its rows from a `Gtk.TreeListModel`; this one declares the same
4
+ // rows directly, because the browser element takes the three numbers it would have read
5
+ // off a `Gtk.TreeListRow` as attributes (ADR 0089). Same tree, same depths, same leaves.
6
+
7
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
8
+ import { TREE_EXPANDER_TREE, treeExpanderMeta } from '../../presentation/tree-expander.meta.js';
9
+
10
+ interface TreeRow {
11
+ readonly label: string;
12
+ readonly depth: number;
13
+ readonly expandable: boolean;
14
+ }
15
+
16
+ /** The tree flattened to rows, parents before their children. */
17
+ const ROWS: readonly TreeRow[] = Object.entries(TREE_EXPANDER_TREE).flatMap(([parent, children]) => [
18
+ { label: parent, depth: 0, expandable: children.length > 0 },
19
+ ...children.map((child) => ({ label: child, depth: 1, expandable: false })),
20
+ ]);
21
+
22
+ export class TreeExpanderWebStory extends StoryElement {
23
+ private _expanders: HTMLElement[] = [];
24
+
25
+ constructor() {
26
+ super(TreeExpanderWebStory.getMetadata(), 'Default');
27
+ }
28
+
29
+ static getMetadata(): StoryMeta {
30
+ return treeExpanderMeta;
31
+ }
32
+
33
+ initialize(): void {
34
+ const list = document.createElement('gtk-box');
35
+ list.setAttribute('orientation', 'vertical');
36
+ list.setAttribute('spacing', '6');
37
+ for (const row of ROWS) {
38
+ const expander = document.createElement('gtk-tree-expander');
39
+ expander.setAttribute('depth', String(row.depth));
40
+ expander.toggleAttribute('expandable', row.expandable);
41
+ const label = document.createElement('gtk-label');
42
+ label.setAttribute('label', row.label);
43
+ expander.appendChild(label);
44
+ list.appendChild(expander);
45
+ this._expanders.push(expander);
46
+ }
47
+ this._apply();
48
+ this.addContent(list);
49
+ }
50
+
51
+ updateArgs(_args: StoryArgs): void {
52
+ this._apply();
53
+ }
54
+
55
+ private _apply(): void {
56
+ const expanded = this.args.expanded as boolean;
57
+ this._expanders.forEach((expander, index) => {
58
+ expander.toggleAttribute('expanded', expanded);
59
+ expander.toggleAttribute('hide-expander', this.args.hideExpander as boolean);
60
+ expander.setAttribute('indent-for-icon', String(this.args.indentForIcon as boolean));
61
+ // A collapsed parent's children are not in a `GtkTreeListModel` at all, so the
62
+ // rows go with the arrow rather than only the arrow turning.
63
+ if (ROWS[index]!.depth > 0) expander.hidden = !expanded;
64
+ });
65
+ }
66
+ }
67
+
68
+ export const TreeExpanderWebStories: WebStoryModule = { stories: [TreeExpanderWebStory] };
@@ -0,0 +1,42 @@
1
+ // Browser port of the Window Handle story. Shares metadata with window-handle.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { windowHandleMeta } from '../../presentation/window-handle.meta.js';
5
+
6
+ export class WindowHandleWebStory extends StoryElement {
7
+ private _handle: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(WindowHandleWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return windowHandleMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ const handle = document.createElement('gtk-window-handle');
19
+ const bar = document.createElement('adw-header-bar');
20
+ const title = document.createElement('adw-window-title');
21
+ title.setAttribute('title', 'Notes');
22
+ bar.appendChild(title);
23
+ handle.appendChild(bar);
24
+ this._handle = handle;
25
+ this._apply();
26
+ this.addContent(handle);
27
+ }
28
+
29
+ updateArgs(_args: StoryArgs): void {
30
+ this._apply();
31
+ }
32
+
33
+ private _apply(): void {
34
+ const handle = this._handle;
35
+ if (!handle) return;
36
+ // The `gtk-titlebar-double-click` setting, spelled as the attribute a document can
37
+ // write: the web port has no `Gtk.Settings` to resolve the action through.
38
+ handle.setAttribute('double-click-action', this.args.action as string);
39
+ }
40
+ }
41
+
42
+ export const WindowHandleWebStories: WebStoryModule = { stories: [WindowHandleWebStory] };
@@ -0,0 +1,43 @@
1
+ // Browser port of the Preferences Row story. Shares metadata with preferences-row.story.ts.
2
+
3
+ import { StoryElement, type StoryArgs, type StoryMeta, type WebStoryModule } from '@gjsify/adwaita-storybook';
4
+ import { preferencesRowMeta } from '../../rows/preferences-row.meta.js';
5
+
6
+ export class PreferencesRowWebStory extends StoryElement {
7
+ private _row: HTMLElement | null = null;
8
+
9
+ constructor() {
10
+ super(PreferencesRowWebStory.getMetadata(), 'Default');
11
+ }
12
+
13
+ static getMetadata(): StoryMeta {
14
+ return preferencesRowMeta;
15
+ }
16
+
17
+ initialize(): void {
18
+ this._row = document.createElement('adw-preferences-row');
19
+ this._sync();
20
+
21
+ const group = document.createElement('adw-preferences-group');
22
+ group.append(this._row);
23
+
24
+ const clamp = document.createElement('adw-clamp');
25
+ clamp.setAttribute('maximum-size', '400');
26
+ clamp.append(group);
27
+
28
+ this.addContent(clamp);
29
+ }
30
+
31
+ updateArgs(_args: StoryArgs): void {
32
+ this._sync();
33
+ }
34
+
35
+ private _sync(): void {
36
+ if (!this._row) return;
37
+ this._row.setAttribute('title', this.args.title as string);
38
+ this._row.toggleAttribute('use-markup', this.args.useMarkup as boolean);
39
+ this._row.toggleAttribute('title-selectable', this.args.titleSelectable as boolean);
40
+ }
41
+ }
42
+
43
+ export const PreferencesRowWebStories: WebStoryModule = { stories: [PreferencesRowWebStory] };