@gtkx/components 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/collection-view.d.ts +30 -0
  2. package/dist/collection-view.d.ts.map +1 -0
  3. package/dist/collection-view.js +52 -0
  4. package/dist/collection-view.js.map +1 -0
  5. package/dist/column-view-column.d.ts +17 -0
  6. package/dist/column-view-column.d.ts.map +1 -0
  7. package/dist/column-view-column.js +51 -0
  8. package/dist/column-view-column.js.map +1 -0
  9. package/dist/column-view.d.ts +18 -0
  10. package/dist/column-view.d.ts.map +1 -0
  11. package/dist/column-view.js +108 -0
  12. package/dist/column-view.js.map +1 -0
  13. package/dist/constraint-layout-apply.d.ts +6 -0
  14. package/dist/constraint-layout-apply.d.ts.map +1 -0
  15. package/dist/constraint-layout-apply.js +107 -0
  16. package/dist/constraint-layout-apply.js.map +1 -0
  17. package/dist/constraint-layout.d.ts +13 -0
  18. package/dist/constraint-layout.d.ts.map +1 -0
  19. package/dist/constraint-layout.js +85 -0
  20. package/dist/constraint-layout.js.map +1 -0
  21. package/dist/contexts/column-view-context.d.ts +17 -0
  22. package/dist/contexts/column-view-context.d.ts.map +1 -0
  23. package/dist/contexts/column-view-context.js +10 -0
  24. package/dist/contexts/column-view-context.js.map +1 -0
  25. package/dist/drop-down.d.ts +41 -0
  26. package/dist/drop-down.d.ts.map +1 -0
  27. package/dist/drop-down.js +129 -0
  28. package/dist/drop-down.js.map +1 -0
  29. package/dist/grid-view.d.ts +16 -0
  30. package/dist/grid-view.d.ts.map +1 -0
  31. package/dist/grid-view.js +22 -0
  32. package/dist/grid-view.js.map +1 -0
  33. package/dist/hooks/use-drop-down-selection.d.ts +15 -0
  34. package/dist/hooks/use-drop-down-selection.d.ts.map +1 -0
  35. package/dist/hooks/use-drop-down-selection.js +35 -0
  36. package/dist/hooks/use-drop-down-selection.js.map +1 -0
  37. package/dist/hooks/use-header-menu.d.ts +4 -0
  38. package/dist/hooks/use-header-menu.d.ts.map +1 -0
  39. package/dist/hooks/use-header-menu.js +32 -0
  40. package/dist/hooks/use-header-menu.js.map +1 -0
  41. package/dist/hooks/use-list-model.d.ts +20 -0
  42. package/dist/hooks/use-list-model.d.ts.map +1 -0
  43. package/dist/hooks/use-list-model.js +70 -0
  44. package/dist/hooks/use-list-model.js.map +1 -0
  45. package/dist/hooks/use-model-installation.d.ts +9 -0
  46. package/dist/hooks/use-model-installation.d.ts.map +1 -0
  47. package/dist/hooks/use-model-installation.js +20 -0
  48. package/dist/hooks/use-model-installation.js.map +1 -0
  49. package/dist/hooks/use-realized-slots.d.ts +20 -0
  50. package/dist/hooks/use-realized-slots.d.ts.map +1 -0
  51. package/dist/hooks/use-realized-slots.js +66 -0
  52. package/dist/hooks/use-realized-slots.js.map +1 -0
  53. package/dist/hooks/use-selection-model.d.ts +12 -0
  54. package/dist/hooks/use-selection-model.d.ts.map +1 -0
  55. package/dist/hooks/use-selection-model.js +111 -0
  56. package/dist/hooks/use-selection-model.js.map +1 -0
  57. package/dist/hooks/use-sort-handler.d.ts +12 -0
  58. package/dist/hooks/use-sort-handler.d.ts.map +1 -0
  59. package/dist/hooks/use-sort-handler.js +87 -0
  60. package/dist/hooks/use-sort-handler.js.map +1 -0
  61. package/dist/index.d.ts +19 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +18 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/list-portal-host.d.ts +11 -0
  66. package/dist/list-portal-host.d.ts.map +1 -0
  67. package/dist/list-portal-host.js +8 -0
  68. package/dist/list-portal-host.js.map +1 -0
  69. package/dist/list-slot.d.ts +14 -0
  70. package/dist/list-slot.d.ts.map +1 -0
  71. package/dist/list-slot.js +29 -0
  72. package/dist/list-slot.js.map +1 -0
  73. package/dist/list-view.d.ts +16 -0
  74. package/dist/list-view.d.ts.map +1 -0
  75. package/dist/list-view.js +31 -0
  76. package/dist/list-view.js.map +1 -0
  77. package/dist/menu-items.d.ts +5 -0
  78. package/dist/menu-items.d.ts.map +1 -0
  79. package/dist/menu-items.js +48 -0
  80. package/dist/menu-items.js.map +1 -0
  81. package/dist/menu.d.ts +18 -0
  82. package/dist/menu.d.ts.map +1 -0
  83. package/dist/menu.js +26 -0
  84. package/dist/menu.js.map +1 -0
  85. package/dist/types.d.ts +198 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +2 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/utils/item-resolver.d.ts +28 -0
  90. package/dist/utils/item-resolver.d.ts.map +1 -0
  91. package/dist/utils/item-resolver.js +111 -0
  92. package/dist/utils/item-resolver.js.map +1 -0
  93. package/dist/utils/list-item-flatten.d.ts +32 -0
  94. package/dist/utils/list-item-flatten.d.ts.map +1 -0
  95. package/dist/utils/list-item-flatten.js +88 -0
  96. package/dist/utils/list-item-flatten.js.map +1 -0
  97. package/dist/utils/position-only-model.d.ts +10 -0
  98. package/dist/utils/position-only-model.d.ts.map +1 -0
  99. package/dist/utils/position-only-model.js +83 -0
  100. package/dist/utils/position-only-model.js.map +1 -0
  101. package/dist/utils/realized-slot-store.d.ts +30 -0
  102. package/dist/utils/realized-slot-store.d.ts.map +1 -0
  103. package/dist/utils/realized-slot-store.js +103 -0
  104. package/dist/utils/realized-slot-store.js.map +1 -0
  105. package/package.json +55 -0
  106. package/src/collection-view.tsx +125 -0
  107. package/src/column-view-column.tsx +73 -0
  108. package/src/column-view.tsx +206 -0
  109. package/src/constraint-layout-apply.ts +121 -0
  110. package/src/constraint-layout.tsx +130 -0
  111. package/src/contexts/column-view-context.ts +28 -0
  112. package/src/drop-down.tsx +259 -0
  113. package/src/grid-view.tsx +73 -0
  114. package/src/hooks/use-drop-down-selection.ts +53 -0
  115. package/src/hooks/use-header-menu.ts +33 -0
  116. package/src/hooks/use-list-model.ts +145 -0
  117. package/src/hooks/use-model-installation.ts +25 -0
  118. package/src/hooks/use-realized-slots.ts +93 -0
  119. package/src/hooks/use-selection-model.ts +121 -0
  120. package/src/hooks/use-sort-handler.ts +102 -0
  121. package/src/index.ts +31 -0
  122. package/src/list-portal-host.tsx +27 -0
  123. package/src/list-slot.tsx +56 -0
  124. package/src/list-view.tsx +85 -0
  125. package/src/menu-items.ts +48 -0
  126. package/src/menu.tsx +34 -0
  127. package/src/types.ts +227 -0
  128. package/src/utils/item-resolver.ts +143 -0
  129. package/src/utils/list-item-flatten.ts +113 -0
  130. package/src/utils/position-only-model.ts +115 -0
  131. package/src/utils/realized-slot-store.ts +126 -0
@@ -0,0 +1,111 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ import { useSignal } from "@gtkx/react";
3
+ import { useLayoutEffect, useRef } from "react";
4
+ const createSelectionModel = (mode, base) => {
5
+ if (mode === Gtk.SelectionMode.MULTIPLE)
6
+ return Gtk.MultiSelection.new(base);
7
+ if (mode === Gtk.SelectionMode.NONE)
8
+ return Gtk.NoSelection.new(base);
9
+ return new Gtk.SingleSelection({ model: base, autoselect: false, canUnselect: true });
10
+ };
11
+ const bitsetOf = (positions) => {
12
+ const bitset = Gtk.Bitset.newEmpty();
13
+ for (const position of positions) {
14
+ if (position >= 0)
15
+ bitset.add(position);
16
+ }
17
+ return bitset;
18
+ };
19
+ const applySelectedPositions = (model, positions) => {
20
+ if (model instanceof Gtk.MultiSelection) {
21
+ if (positions.length === 0) {
22
+ const current = model.getSelection();
23
+ if (!current.isEmpty())
24
+ model.unselectAll();
25
+ return;
26
+ }
27
+ const requested = bitsetOf(positions);
28
+ const changed = model.getSelection();
29
+ changed.difference(requested);
30
+ if (changed.isEmpty())
31
+ return;
32
+ model.setSelection(requested, changed);
33
+ return;
34
+ }
35
+ if (positions.length === 0) {
36
+ model.unselectAll();
37
+ return;
38
+ }
39
+ const first = positions[0];
40
+ if (first !== undefined && first >= 0)
41
+ model.selectItem(first, true);
42
+ };
43
+ const readSelectedIds = (model, resolver) => {
44
+ const selection = model.getSelection();
45
+ const ids = [];
46
+ const count = Number(selection.getSize());
47
+ for (let index = 0; index < count; index++) {
48
+ const position = selection.getNth(index);
49
+ const id = resolver.idOf(position);
50
+ if (id !== undefined)
51
+ ids.push(id);
52
+ }
53
+ return ids;
54
+ };
55
+ const idsToPositions = (ids, resolver) => {
56
+ if (ids === undefined || ids === null)
57
+ return [];
58
+ const positions = [];
59
+ for (const id of ids) {
60
+ const position = resolver.positionOf(id);
61
+ if (position >= 0)
62
+ positions.push(position);
63
+ }
64
+ return positions;
65
+ };
66
+ const sameIds = (a, b) => {
67
+ if (a.length !== b.length)
68
+ return false;
69
+ for (let index = 0; index < a.length; index++) {
70
+ if (a[index] !== b[index])
71
+ return false;
72
+ }
73
+ return true;
74
+ };
75
+ export const useSelectionModel = (options) => {
76
+ const { base, selectionMode, selected, onSelectionChanged, resolver } = options;
77
+ const mode = selectionMode ?? Gtk.SelectionMode.SINGLE;
78
+ const modelRef = useRef(null);
79
+ const modeRef = useRef(null);
80
+ if (modelRef.current === null || modeRef.current !== mode) {
81
+ modelRef.current = createSelectionModel(mode, base);
82
+ modeRef.current = mode;
83
+ }
84
+ const model = modelRef.current;
85
+ const onChangedRef = useRef(onSelectionChanged);
86
+ onChangedRef.current = onSelectionChanged;
87
+ const resolverRef = useRef(resolver);
88
+ resolverRef.current = resolver;
89
+ const lastReportedRef = useRef(null);
90
+ const report = () => {
91
+ const callback = onChangedRef.current;
92
+ if (!callback)
93
+ return;
94
+ const ids = readSelectedIds(model, resolverRef.current);
95
+ if (lastReportedRef.current !== null && sameIds(lastReportedRef.current, ids))
96
+ return;
97
+ lastReportedRef.current = ids;
98
+ callback(ids);
99
+ };
100
+ useSignal(model, "selection-changed", report);
101
+ useLayoutEffect(() => {
102
+ if (model.getModel() !== base)
103
+ model.setModel(base);
104
+ if (selected !== undefined && selected !== null) {
105
+ applySelectedPositions(model, idsToPositions(selected, resolver));
106
+ }
107
+ report();
108
+ }, [model, base, selected, resolver]);
109
+ return model;
110
+ };
111
+ //# sourceMappingURL=use-selection-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-selection-model.js","sourceRoot":"","sources":["../../src/hooks/use-selection-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ import { type GObjectTarget } from "@gtkx/react/internal";
3
+ import type { ColumnRegistration } from "../contexts/column-view-context.js";
4
+ export interface SortHandlerOptions {
5
+ columnView: GObjectTarget<Gtk.ColumnView>;
6
+ sortColumn: string | null | undefined;
7
+ sortOrder: Gtk.SortType | null | undefined;
8
+ onSortChanged: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;
9
+ columns: ColumnRegistration[];
10
+ }
11
+ export declare const useSortHandler: (options: SortHandlerOptions) => void;
12
+ //# sourceMappingURL=use-sort-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sort-handler.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sort-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1C,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,SAAS,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACzF,OAAO,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAkDD,eAAO,MAAM,cAAc,GAAI,SAAS,kBAAkB,KAAG,IAwC5D,CAAC"}
@@ -0,0 +1,87 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ import { resolveGobjectTarget } from "@gtkx/react/internal";
3
+ import { useLayoutEffect, useRef } from "react";
4
+ const neutralSorter = () => Gtk.CustomSorter.new(() => 0);
5
+ const ensureColumnSorters = (columns, activeId) => {
6
+ for (const registration of columns) {
7
+ const wantsSorter = registration.sortable || registration.id === activeId;
8
+ const hasSorter = registration.column.getSorter() !== null;
9
+ if (wantsSorter && !hasSorter) {
10
+ registration.column.setSorter(neutralSorter());
11
+ }
12
+ else if (!wantsSorter && hasSorter) {
13
+ registration.column.setSorter(null);
14
+ }
15
+ }
16
+ };
17
+ const columnForId = (columns, id) => {
18
+ if (id === null)
19
+ return null;
20
+ for (const registration of columns) {
21
+ if (registration.id === id)
22
+ return registration.column;
23
+ }
24
+ return null;
25
+ };
26
+ const idForColumn = (columns, column) => {
27
+ if (column === null)
28
+ return null;
29
+ for (const registration of columns) {
30
+ if (registration.column === column)
31
+ return registration.id;
32
+ }
33
+ return column.getId();
34
+ };
35
+ const primarySort = (sorter) => sorter instanceof Gtk.ColumnViewSorter
36
+ ? { column: sorter.getPrimarySortColumn(), order: sorter.getPrimarySortOrder() }
37
+ : { column: null, order: Gtk.SortType.ASCENDING };
38
+ const disconnectSorter = (subscription) => {
39
+ if (subscription.sorter !== null && subscription.handler !== null) {
40
+ subscription.sorter.off("changed", subscription.handler);
41
+ }
42
+ subscription.sorter = null;
43
+ subscription.handler = null;
44
+ };
45
+ export const useSortHandler = (options) => {
46
+ const { columnView, sortColumn, sortOrder, onSortChanged, columns } = options;
47
+ const activeId = sortColumn ?? null;
48
+ const order = sortOrder ?? Gtk.SortType.ASCENDING;
49
+ const onChangedRef = useRef(onSortChanged);
50
+ onChangedRef.current = onSortChanged;
51
+ const columnsRef = useRef(columns);
52
+ columnsRef.current = columns;
53
+ const suppressRef = useRef(false);
54
+ const subscriptionRef = useRef({ sorter: null, handler: null });
55
+ const resubscribe = (sorter) => {
56
+ const subscription = subscriptionRef.current;
57
+ if (sorter === subscription.sorter)
58
+ return;
59
+ disconnectSorter(subscription);
60
+ if (sorter === null)
61
+ return;
62
+ const handler = () => {
63
+ if (suppressRef.current)
64
+ return;
65
+ const callback = onChangedRef.current;
66
+ if (!callback)
67
+ return;
68
+ const { column, order: primaryOrder } = primarySort(sorter);
69
+ callback(idForColumn(columnsRef.current, column), primaryOrder);
70
+ };
71
+ subscription.sorter = sorter;
72
+ subscription.handler = handler;
73
+ sorter.on("changed", handler);
74
+ };
75
+ useLayoutEffect(() => {
76
+ const view = resolveGobjectTarget(columnView);
77
+ if (view === null)
78
+ return;
79
+ ensureColumnSorters(columns, activeId);
80
+ suppressRef.current = true;
81
+ view.sortByColumn(columnForId(columns, activeId), order);
82
+ suppressRef.current = false;
83
+ resubscribe(view.getSorter());
84
+ });
85
+ useLayoutEffect(() => () => disconnectSorter(subscriptionRef.current), []);
86
+ };
87
+ //# sourceMappingURL=use-sort-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sort-handler.js","sourceRoot":"","sources":["../../src/hooks/use-sort-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Higher-level GTKX components: declarative, opinionated abstractions layered on
3
+ * top of the generated `@gtkx/jsx` element bindings and the `@gtkx/react`
4
+ * runtime. Each component pairs a GObject widget with a gtkx-authored prop
5
+ * surface (item models, render callbacks, selection, sorting) and is exported
6
+ * under an unprefixed name to distinguish it from the raw `Gtk*`/`Adw*`/`G*`
7
+ * intrinsic element it builds upon.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ export { ColumnView, type ColumnViewComponentProps } from "./column-view.js";
12
+ export { ColumnViewColumn, type ColumnViewColumnComponentProps } from "./column-view-column.js";
13
+ export { ConstraintLayout, type ConstraintLayoutProps } from "./constraint-layout.js";
14
+ export { ComboRow, type ComboRowComponentProps, DropDown, type DropDownComponentProps } from "./drop-down.js";
15
+ export { GridView, type GridViewComponentProps } from "./grid-view.js";
16
+ export { ListView, type ListViewComponentProps } from "./list-view.js";
17
+ export { Menu, type MenuProps } from "./menu.js";
18
+ export type { ColumnViewColumnProps, ColumnViewProps, ConstraintGuideProps, ConstraintProps, ConstraintVflProps, DropDownProps, GridViewProps, ListItem, ListViewProps, MenuEntry, MenuItemsProps, } from "./types.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,KAAK,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,KAAK,sBAAsB,EAAE,QAAQ,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACjD,YAAY,EACR,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,QAAQ,EACR,aAAa,EACb,SAAS,EACT,cAAc,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Higher-level GTKX components: declarative, opinionated abstractions layered on
3
+ * top of the generated `@gtkx/jsx` element bindings and the `@gtkx/react`
4
+ * runtime. Each component pairs a GObject widget with a gtkx-authored prop
5
+ * surface (item models, render callbacks, selection, sorting) and is exported
6
+ * under an unprefixed name to distinguish it from the raw `Gtk*`/`Adw*`/`G*`
7
+ * intrinsic element it builds upon.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ export { ColumnView } from "./column-view.js";
12
+ export { ColumnViewColumn } from "./column-view-column.js";
13
+ export { ConstraintLayout } from "./constraint-layout.js";
14
+ export { ComboRow, DropDown } from "./drop-down.js";
15
+ export { GridView } from "./grid-view.js";
16
+ export { ListView } from "./list-view.js";
17
+ export { Menu } from "./menu.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAiC,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAuC,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAA8B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAA+B,QAAQ,EAA+B,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAA+B,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAA+B,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAkB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type ReactNode } from "react";
2
+ import { type SlotRenderer } from "./list-slot.js";
3
+ import type { ItemResolver } from "./utils/item-resolver.js";
4
+ import type { RealizedSlotStore } from "./utils/realized-slot-store.js";
5
+ export interface ListPortalHostProps<T, S> {
6
+ store: RealizedSlotStore;
7
+ resolver: ItemResolver<T, S>;
8
+ render: SlotRenderer<T, S>;
9
+ }
10
+ export declare const ListPortalHost: <T, S>({ store, resolver, render }: ListPortalHostProps<T, S>) => ReactNode;
11
+ //# sourceMappingURL=list-portal-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-portal-host.d.ts","sourceRoot":"","sources":["../src/list-portal-host.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AACvE,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE,MAAM,WAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EAAE,6BAA6B,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SAe7F,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Fragment, useSyncExternalStore } from "react";
3
+ import { ListSlot } from "./list-slot.js";
4
+ export const ListPortalHost = ({ store, resolver, render }) => {
5
+ const containers = useSyncExternalStore(store.subscribeSet, store.getSlotsSnapshot, store.getSlotsSnapshot);
6
+ return (_jsx(Fragment, { children: containers.map((container) => (_jsx(ListSlot, { container: container, store: store, resolver: resolver, render: render }, store.keyFor(container)))) }));
7
+ };
8
+ //# sourceMappingURL=list-portal-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-portal-host.js","sourceRoot":"","sources":["../src/list-portal-host.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAkB,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAqB,MAAM,gBAAgB,CAAC;AAU7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAA6B,EAAa,EAAE;IACtG,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC5G,OAAO,CACH,KAAC,QAAQ,cACJ,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAC3B,KAAC,QAAQ,IAEL,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,IAJT,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAK9B,CACL,CAAC,GACK,CACd,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import type * as Gtk from "@gtkx/gi/gtk";
3
+ import { type ReactNode } from "react";
4
+ import type { ItemResolver } from "./utils/item-resolver.js";
5
+ import type { RealizedSlotStore } from "./utils/realized-slot-store.js";
6
+ export type SlotRenderer<T, S> = (value: T | S | undefined, treeRow: Gtk.TreeListRow | null, isHeader: boolean) => ReactNode;
7
+ export interface ListSlotProps<T, S> {
8
+ container: GObject.Object;
9
+ store: RealizedSlotStore;
10
+ resolver: ItemResolver<T, S>;
11
+ render: SlotRenderer<T, S>;
12
+ }
13
+ export declare const ListSlot: <T, S>(props: ListSlotProps<T, S>) => ReactNode;
14
+ //# sourceMappingURL=list-slot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-slot.d.ts","sourceRoot":"","sources":["../src/list-slot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAuB,KAAK,SAAS,EAAqC,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAa,MAAM,gCAAgC,CAAC;AAEnF,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAC7B,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EACxB,OAAO,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,EAC/B,QAAQ,EAAE,OAAO,KAChB,SAAS,CAAC;AAEf,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC9B;AAmCD,eAAO,MAAM,QAAQ,EAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { GtkTreeExpander } from "@gtkx/jsx/gtk";
2
+ import { createPortal } from "@gtkx/react";
3
+ import { createElement, memo, useCallback, useSyncExternalStore } from "react";
4
+ const wrapInTreeExpander = (content, treeRow, metadata) => createElement(GtkTreeExpander, {
5
+ ref: (expander) => {
6
+ if (expander !== null)
7
+ expander.setListRow(treeRow);
8
+ },
9
+ hideExpander: metadata.hideExpander,
10
+ indentForDepth: metadata.indentForDepth,
11
+ indentForIcon: metadata.indentForIcon,
12
+ }, content);
13
+ const SlotImpl = ({ container, store, resolver, render }) => {
14
+ const subscribe = useCallback((onChange) => store.subscribePosition(container, onChange), [store, container]);
15
+ const getSnapshot = useCallback(() => store.getPosition(container), [store, container]);
16
+ const entry = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
17
+ if (entry.position < 0)
18
+ return null;
19
+ const resolved = resolver.resolve(entry.position, entry.treeRow, entry.item);
20
+ if (!resolved.present)
21
+ return null;
22
+ const content = render(resolved.value, resolved.treeRow, resolved.isHeader);
23
+ const portalled = resolved.treeRow !== null && !resolved.isHeader
24
+ ? wrapInTreeExpander(content, resolved.treeRow, resolved.metadata)
25
+ : content;
26
+ return createPortal(portalled, container, store.keyFor(container));
27
+ };
28
+ export const ListSlot = memo(SlotImpl);
29
+ //# sourceMappingURL=list-slot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-slot.js","sourceRoot":"","sources":["../src/list-slot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAkB,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAkB/F,MAAM,kBAAkB,GAAG,CAAC,OAAkB,EAAE,OAAwB,EAAE,QAA0B,EAAa,EAAE,CAC/G,aAAa,CACT,eAAe,EACf;IACI,GAAG,EAAE,CAAC,QAAiC,EAAE,EAAE;QACvC,IAAI,QAAQ,KAAK,IAAI;YAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,YAAY,EAAE,QAAQ,CAAC,YAAY;IACnC,cAAc,EAAE,QAAQ,CAAC,cAAc;IACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;CACxC,EACD,OAAO,CACV,CAAC;AAEN,MAAM,QAAQ,GAAG,CAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAuB,EAAa,EAAE;IAC9F,MAAM,SAAS,GAAG,WAAW,CACzB,CAAC,QAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,EACtE,CAAC,KAAK,EAAE,SAAS,CAAC,CACrB,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAc,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAExE,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7E,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5E,MAAM,SAAS,GACX,QAAQ,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAC3C,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAClE,CAAC,CAAC,OAAO,CAAC;IAClB,OAAO,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAoD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type GtkListViewProps } from "@gtkx/jsx/gtk";
2
+ import type { ReactNode } from "react";
3
+ import type { ListViewProps } from "./types.js";
4
+ /**
5
+ * Props for the {@link ListView} component: the raw `GtkListView` element
6
+ * surface with its factory/model wiring replaced by the declarative
7
+ * {@link ListViewProps} API.
8
+ */
9
+ export type ListViewComponentProps<T = unknown, S = unknown> = Omit<GtkListViewProps, keyof ListViewProps<T, S>> & ListViewProps<T, S>;
10
+ /**
11
+ * A `GtkListView` driven by a declarative `items`/`renderItem` API with
12
+ * optional controlled selection, section headers, and tree autoexpansion.
13
+ * Supplying an external `model` switches to the uncontrolled form.
14
+ */
15
+ export declare const ListView: <T = unknown, S = unknown>(props: ListViewComponentProps<T, S>) => ReactNode;
16
+ //# sourceMappingURL=list-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-view.d.ts","sourceRoot":"","sources":["../src/list-view.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAO,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhD;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC5G,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SAiDxF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { GtkListView } from "@gtkx/jsx/gtk";
3
+ import { CollectionView } from "./collection-view.js";
4
+ const factoryBinding = {
5
+ install: (widget, factory) => widget.setFactory(factory),
6
+ uninstall: (widget) => widget.setFactory(null),
7
+ };
8
+ const headerFactoryBinding = {
9
+ install: (widget, factory) => widget.setHeaderFactory(factory),
10
+ uninstall: (widget) => widget.setHeaderFactory(null),
11
+ };
12
+ const modelBinding = {
13
+ install: (widget, model) => widget.setModel(model),
14
+ };
15
+ /**
16
+ * A `GtkListView` driven by a declarative `items`/`renderItem` API with
17
+ * optional controlled selection, section headers, and tree autoexpansion.
18
+ * Supplying an external `model` switches to the uncontrolled form.
19
+ */
20
+ export const ListView = (props) => {
21
+ const { ref, items, model, renderItem, autoexpand, renderHeader, selected, selectionMode, onSelectionChanged, estimatedItemHeight, estimatedItemWidth, ...intrinsicProps } = props;
22
+ const renderItemFn = renderItem;
23
+ const slotRenderer = (value, treeRow, isHeader) => {
24
+ if (isHeader)
25
+ return null;
26
+ return treeRow === null ? renderItemFn(value) : renderItemFn(value, treeRow);
27
+ };
28
+ const useHeader = model === undefined && typeof renderHeader === "function";
29
+ return (_jsx(CollectionView, { element: GtkListView, intrinsicProps: intrinsicProps, ref: ref, items: model === undefined ? items : undefined, model: model, renderItem: slotRenderer, autoexpand: autoexpand, renderHeader: useHeader ? (value) => renderHeader?.(value) ?? null : undefined, estimatedHeight: estimatedItemHeight, estimatedWidth: estimatedItemWidth, selected: selected, selectionMode: selectionMode, onSelectionChanged: onSelectionChanged, factoryBinding: factoryBinding, headerFactoryBinding: useHeader ? headerFactoryBinding : undefined, modelBinding: modelBinding }));
30
+ };
31
+ //# sourceMappingURL=list-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-view.js","sourceRoot":"","sources":["../src/list-view.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAyB,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAqB,MAAM,sBAAsB,CAAC;AAIzE,MAAM,cAAc,GAAG;IACnB,OAAO,EAAE,CAAC,MAAoB,EAAE,OAAkC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;IACjG,SAAS,EAAE,CAAC,MAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;CAC/D,CAAC;AAEF,MAAM,oBAAoB,GAAG;IACzB,OAAO,EAAE,CAAC,MAAoB,EAAE,OAAkC,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACvG,SAAS,EAAE,CAAC,MAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC;CACrE,CAAC;AAEF,MAAM,YAAY,GAA+B;IAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAA2B,CAAC;CAC3E,CAAC;AAUF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAA2B,KAAmC,EAAa,EAAE;IACjG,MAAM,EACF,GAAG,EACH,KAAK,EACL,KAAK,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,GAAG,cAAc,EACpB,GAAG,KAKH,CAAC;IAEF,MAAM,YAAY,GAAG,UAAkE,CAAC;IACxF,MAAM,YAAY,GAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAClE,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAU,EAAE,OAAO,CAAC,CAAC;IAC3F,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,OAAO,YAAY,KAAK,UAAU,CAAC;IAE5E,OAAO,CACH,KAAC,cAAc,IACX,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,cAAc,EAC9B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC9C,KAAK,EAAE,KAAkC,EACzC,UAAU,EAAE,YAAY,EACxB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,KAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,EACnF,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,kBAAkB,EAClC,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,cAAc,EAC9B,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,EAClE,YAAY,EAAE,YAAY,GAC5B,CACL,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import * as Gio from "@gtkx/gi/gio";
2
+ import type { MenuEntry } from "./types.js";
3
+ export declare const applyMenuItems: (menu: Gio.Menu, entries: MenuEntry[] | null) => void;
4
+ export declare const menuItemsEqual: (a: MenuEntry[] | null, b: MenuEntry[] | null) => boolean;
5
+ //# sourceMappingURL=menu-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-items.d.ts","sourceRoot":"","sources":["../src/menu-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyB5C,eAAO,MAAM,cAAc,GAAI,MAAM,GAAG,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,KAAG,IAG5E,CAAC;AAcF,eAAO,MAAM,cAAc,GAAI,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,KAAG,OAI7E,CAAC"}
@@ -0,0 +1,48 @@
1
+ import * as Gio from "@gtkx/gi/gio";
2
+ const buildMenuModel = (entries) => {
3
+ const menu = new Gio.Menu();
4
+ appendEntries(menu, entries);
5
+ return menu;
6
+ };
7
+ const appendEntries = (menu, entries) => {
8
+ for (const entry of entries) {
9
+ if (entry.section !== undefined) {
10
+ menu.appendSection(entry.label ?? null, buildMenuModel(entry.section));
11
+ continue;
12
+ }
13
+ if (entry.submenu !== undefined) {
14
+ menu.appendSubmenu(entry.label ?? null, buildMenuModel(entry.submenu));
15
+ continue;
16
+ }
17
+ const item = new Gio.MenuItem();
18
+ if (entry.label !== undefined)
19
+ item.setLabel(entry.label);
20
+ if (entry.action !== undefined)
21
+ item.setDetailedAction(entry.action);
22
+ menu.appendItem(item);
23
+ }
24
+ };
25
+ export const applyMenuItems = (menu, entries) => {
26
+ menu.removeAll();
27
+ if (entries)
28
+ appendEntries(menu, entries);
29
+ };
30
+ const entryEqual = (a, b) => a.label === b.label &&
31
+ a.action === b.action &&
32
+ entryListEqual(a.submenu, b.submenu) &&
33
+ entryListEqual(a.section, b.section);
34
+ const entryListEqual = (a, b) => {
35
+ if (a === b)
36
+ return true;
37
+ if (a === undefined || b === undefined)
38
+ return false;
39
+ return a.length === b.length && a.every((entry, index) => entryEqual(entry, b[index]));
40
+ };
41
+ export const menuItemsEqual = (a, b) => {
42
+ if (a === b)
43
+ return true;
44
+ if (a === null || b === null)
45
+ return false;
46
+ return entryListEqual(a, b);
47
+ };
48
+ //# sourceMappingURL=menu-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-items.js","sourceRoot":"","sources":["../src/menu-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAGpC,MAAM,cAAc,GAAG,CAAC,OAAoB,EAAY,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,OAAoB,EAAQ,EAAE;IACjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,SAAS;QACb,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,SAAS;QACb,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAc,EAAE,OAA2B,EAAQ,EAAE;IAChF,IAAI,CAAC,SAAS,EAAE,CAAC;IACjB,IAAI,OAAO;QAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,CAAY,EAAE,CAAY,EAAW,EAAE,CACvD,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;IACnB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;IACrB,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;IACpC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,CAA0B,EAAE,CAA0B,EAAW,EAAE;IACvF,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAc,CAAC,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAqB,EAAE,CAAqB,EAAW,EAAE;IACpF,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC"}
package/dist/menu.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type * as Gio from "@gtkx/gi/gio";
2
+ import { type GMenuProps } from "@gtkx/jsx/gio";
3
+ import { type ReactNode, type Ref } from "react";
4
+ import type { MenuItemsProps } from "./types.js";
5
+ /**
6
+ * Props for the {@link Menu} component: the raw `GMenu` element surface with a
7
+ * declarative `items` model layered on top.
8
+ */
9
+ export type MenuProps = Omit<GMenuProps, keyof MenuItemsProps> & MenuItemsProps & {
10
+ ref?: Ref<Gio.Menu | null>;
11
+ };
12
+ /**
13
+ * A declarative `Gio.Menu` built from an `items` tree of {@link MenuEntry}
14
+ * values. Rebuilds the underlying menu model whenever the item structure
15
+ * changes.
16
+ */
17
+ export declare const Menu: (props: MenuProps) => ReactNode;
18
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,GAAG,EAA2B,MAAM,OAAO,CAAC;AAEzF,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,cAAc,CAAC,GAAG,cAAc,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CAAE,CAAC;AAEjH;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,SAAS,KAAG,SAevC,CAAC"}
package/dist/menu.js ADDED
@@ -0,0 +1,26 @@
1
+ import { GMenu } from "@gtkx/jsx/gio";
2
+ import { useForwardedRef } from "@gtkx/react";
3
+ import { createElement, useLayoutEffect, useRef } from "react";
4
+ import { applyMenuItems, menuItemsEqual } from "./menu-items.js";
5
+ /**
6
+ * A declarative `Gio.Menu` built from an `items` tree of {@link MenuEntry}
7
+ * values. Rebuilds the underlying menu model whenever the item structure
8
+ * changes.
9
+ */
10
+ export const Menu = (props) => {
11
+ const { items, ref, ...rest } = props;
12
+ const [menuRef, mergedRef] = useForwardedRef(ref);
13
+ const appliedRef = useRef(null);
14
+ useLayoutEffect(() => {
15
+ const menu = menuRef.current;
16
+ if (!menu)
17
+ return;
18
+ const entries = items ?? null;
19
+ if (menuItemsEqual(appliedRef.current, entries))
20
+ return;
21
+ appliedRef.current = entries;
22
+ applyMenuItems(menu, entries);
23
+ });
24
+ return createElement(GMenu, { ...rest, ref: mergedRef });
25
+ };
26
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAmB,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAA4B,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AASjE;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAgB,EAAa,EAAE;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAEpD,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC;QAC9B,IAAI,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO;QACxD,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC"}