@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,41 @@
1
+ import type * as Gio from "@gtkx/gi/gio";
2
+ import type * as Gtk from "@gtkx/gi/gtk";
3
+ import { type AdwComboRowProps } from "@gtkx/jsx/adw";
4
+ import { type GtkDropDownProps } from "@gtkx/jsx/gtk";
5
+ import { type ReactNode } from "react";
6
+ import type { DropDownProps } from "./types.js";
7
+ export interface DropDownWidget extends Gtk.Widget {
8
+ getSelected(): number;
9
+ setSelected(position: number): void;
10
+ setModel(model: Gio.ListModel | null): void;
11
+ setFactory(factory: Gtk.ListItemFactory | null): void;
12
+ setListFactory(factory: Gtk.ListItemFactory | null): void;
13
+ setHeaderFactory(factory: Gtk.ListItemFactory | null): void;
14
+ }
15
+ /**
16
+ * Props for the {@link DropDown} component: the raw `GtkDropDown` element
17
+ * surface with its factory/model wiring replaced by the declarative
18
+ * {@link DropDownProps} API.
19
+ */
20
+ export type DropDownComponentProps<T = unknown, S = unknown> = Omit<GtkDropDownProps, keyof DropDownProps<T, S>> & DropDownProps<T, S>;
21
+ /**
22
+ * Props for the {@link ComboRow} component: the raw `AdwComboRow` element
23
+ * surface with its factory/model wiring replaced by the declarative
24
+ * {@link DropDownProps} API.
25
+ */
26
+ export type ComboRowComponentProps<T = unknown, S = unknown> = Omit<AdwComboRowProps, keyof DropDownProps<T, S>> & DropDownProps<T, S>;
27
+ /**
28
+ * A `GtkDropDown` driven by a declarative `items` model with a controlled
29
+ * `selectedId` and per-slot renderers for the selected face, the popup list,
30
+ * and section headers. Supplying an external `model` switches to the
31
+ * uncontrolled form.
32
+ */
33
+ export declare const DropDown: <T = unknown, S = unknown>(props: DropDownComponentProps<T, S>) => ReactNode;
34
+ /**
35
+ * An `AdwComboRow` driven by a declarative `items` model with a controlled
36
+ * `selectedId` and per-slot renderers for the selected face, the popup list,
37
+ * and section headers. Supplying an external `model` switches to the
38
+ * uncontrolled form.
39
+ */
40
+ export declare const ComboRow: <T = unknown, S = unknown>(props: ComboRowComponentProps<T, S>) => ReactNode;
41
+ //# sourceMappingURL=drop-down.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-down.d.ts","sourceRoot":"","sources":["../src/drop-down.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAe,KAAK,gBAAgB,EAAY,MAAM,eAAe,CAAC;AAE7E,OAAO,EAIH,KAAK,SAAS,EAKjB,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,YAAY,CAAC;AAI1D,MAAM,WAAW,cAAe,SAAQ,GAAG,CAAC,MAAM;IAC9C,WAAW,IAAI,MAAM,CAAC;IACtB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5C,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;IACtD,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;CAC/D;AA6LD;;;;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,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;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SAGxF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SAGxF,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AdwComboRow } from "@gtkx/jsx/adw";
3
+ import { GtkDropDown, GtkLabel } from "@gtkx/jsx/gtk";
4
+ import { useForwardedRef } from "@gtkx/react";
5
+ import { createElement, useCallback, useRef, useState, } from "react";
6
+ import { useDropDownSelection } from "./hooks/use-drop-down-selection.js";
7
+ import { useListModel } from "./hooks/use-list-model.js";
8
+ import { useModelInstallation } from "./hooks/use-model-installation.js";
9
+ import { useRealizedSlots } from "./hooks/use-realized-slots.js";
10
+ import { ListPortalHost } from "./list-portal-host.js";
11
+ const itemFactoryBinding = {
12
+ install: (widget, factory) => widget.setFactory(factory),
13
+ uninstall: (widget) => widget.setFactory(null),
14
+ };
15
+ const listFactoryBinding = {
16
+ install: (widget, factory) => widget.setListFactory(factory),
17
+ uninstall: (widget) => widget.setListFactory(null),
18
+ };
19
+ const headerFactoryBinding = {
20
+ install: (widget, factory) => widget.setHeaderFactory(factory),
21
+ uninstall: (widget) => widget.setHeaderFactory(null),
22
+ };
23
+ const defaultRenderer = (value, _treeRow, isHeader) => {
24
+ if (isHeader || value === undefined || value === null)
25
+ return null;
26
+ return createElement(GtkLabel, { label: String(value) });
27
+ };
28
+ const toItemRenderer = (renderItem) => {
29
+ if (typeof renderItem !== "function")
30
+ return defaultRenderer;
31
+ return (value, _treeRow, isHeader) => (isHeader ? null : renderItem(value));
32
+ };
33
+ const toPopupRenderer = (renderListItem, renderItem) => {
34
+ if (typeof renderListItem === "function")
35
+ return (value, _treeRow, isHeader) => (isHeader ? null : renderListItem(value));
36
+ return toItemRenderer(renderItem);
37
+ };
38
+ const toHeaderRenderer = (renderHeader) => {
39
+ if (typeof renderHeader !== "function")
40
+ return () => null;
41
+ return (value) => renderHeader(value);
42
+ };
43
+ const createFaceResolver = (resolver, selectedPosition) => ({
44
+ count: resolver.count,
45
+ positionOf: (id) => resolver.positionOf(id),
46
+ idOf: (position) => resolver.idOf(position),
47
+ resolve: (_position, treeRow) => resolver.resolve(selectedPosition, treeRow, null),
48
+ });
49
+ const useDropDownWiring = (props) => {
50
+ const widgetRef = useRef(null);
51
+ const [widget, setWidget] = useState(null);
52
+ const captureWidget = useCallback((value) => {
53
+ widgetRef.current = value;
54
+ setWidget(value);
55
+ }, []);
56
+ const [, setRef] = useForwardedRef(props.ref, captureWidget);
57
+ const externalModel = props.model;
58
+ const listModel = useListModel(externalModel === undefined ? { items: props.items ?? undefined } : { model: externalModel });
59
+ const useHeader = externalModel === undefined && typeof props.renderHeader === "function";
60
+ const face = useRealizedSlots({ target: widgetRef, binding: itemFactoryBinding });
61
+ const popup = useRealizedSlots({ target: widgetRef, binding: listFactoryBinding });
62
+ const header = useRealizedSlots({
63
+ target: useHeader ? widgetRef : null,
64
+ binding: headerFactoryBinding,
65
+ });
66
+ useModelInstallation(widgetRef, listModel.model, (widget, model) => widget.setModel(model));
67
+ const selectedPosition = useDropDownSelection({
68
+ widget,
69
+ resolver: listModel.resolver,
70
+ selectedId: props.selectedId,
71
+ onSelectionChanged: props.onSelectionChanged,
72
+ });
73
+ const controlledPosition = props.selectedId === undefined || props.selectedId === null
74
+ ? -1
75
+ : listModel.resolver.positionOf(props.selectedId);
76
+ const facePosition = controlledPosition >= 0 ? controlledPosition : selectedPosition < 0 ? 0 : selectedPosition;
77
+ return {
78
+ setRef,
79
+ resolver: listModel.resolver,
80
+ faceResolver: createFaceResolver(listModel.resolver, facePosition),
81
+ headerResolver: listModel.headerResolver,
82
+ faceStore: face.store,
83
+ popupStore: popup.store,
84
+ headerStore: header.store,
85
+ useHeader,
86
+ };
87
+ };
88
+ const DropDownImpl = (props) => {
89
+ const { setRef, resolver, faceResolver, headerResolver, faceStore, popupStore, headerStore, useHeader } = useDropDownWiring(props);
90
+ const intrinsic = createElement(props.element, { ...props.intrinsicProps, ref: setRef });
91
+ return (_jsxs(_Fragment, { children: [intrinsic, _jsx(ListPortalHost, { store: faceStore, resolver: faceResolver, render: toItemRenderer(props.renderItem) }), _jsx(ListPortalHost, { store: popupStore, resolver: resolver, render: toPopupRenderer(props.renderListItem, props.renderItem) }), useHeader ? (_jsx(ListPortalHost, { store: headerStore, resolver: headerResolver, render: toHeaderRenderer(props.renderHeader) })) : null] }));
92
+ };
93
+ const extractDropDownProps = (props) => {
94
+ const { ref, items, model, renderItem, renderListItem, renderHeader, selectedId, onSelectionChanged, ...intrinsicProps } = props;
95
+ return {
96
+ impl: {
97
+ ref,
98
+ items: items,
99
+ model: model,
100
+ renderItem: renderItem,
101
+ renderListItem: renderListItem,
102
+ renderHeader: renderHeader,
103
+ selectedId: selectedId,
104
+ onSelectionChanged: onSelectionChanged,
105
+ },
106
+ intrinsicProps: intrinsicProps,
107
+ };
108
+ };
109
+ /**
110
+ * A `GtkDropDown` driven by a declarative `items` model with a controlled
111
+ * `selectedId` and per-slot renderers for the selected face, the popup list,
112
+ * and section headers. Supplying an external `model` switches to the
113
+ * uncontrolled form.
114
+ */
115
+ export const DropDown = (props) => {
116
+ const { impl, intrinsicProps } = extractDropDownProps(props);
117
+ return _jsx(DropDownImpl, { element: GtkDropDown, intrinsicProps: intrinsicProps, ...impl });
118
+ };
119
+ /**
120
+ * An `AdwComboRow` driven by a declarative `items` model with a controlled
121
+ * `selectedId` and per-slot renderers for the selected face, the popup list,
122
+ * and section headers. Supplying an external `model` switches to the
123
+ * uncontrolled form.
124
+ */
125
+ export const ComboRow = (props) => {
126
+ const { impl, intrinsicProps } = extractDropDownProps(props);
127
+ return _jsx(DropDownImpl, { element: AdwComboRow, intrinsicProps: intrinsicProps, ...impl });
128
+ };
129
+ //# sourceMappingURL=drop-down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-down.js","sourceRoot":"","sources":["../src/drop-down.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type GtkGridViewProps } from "@gtkx/jsx/gtk";
2
+ import type { ReactNode } from "react";
3
+ import type { GridViewProps } from "./types.js";
4
+ /**
5
+ * Props for the {@link GridView} component: the raw `GtkGridView` element
6
+ * surface with its factory/model wiring replaced by the declarative
7
+ * {@link GridViewProps} API.
8
+ */
9
+ export type GridViewComponentProps<T = unknown> = Omit<GtkGridViewProps, keyof GridViewProps<T>> & GridViewProps<T>;
10
+ /**
11
+ * A `GtkGridView` driven by a declarative `items`/`renderItem` API with
12
+ * optional controlled selection. Supplying an external `model` switches to the
13
+ * uncontrolled form.
14
+ */
15
+ export declare const GridView: <T = unknown>(props: GridViewComponentProps<T>) => ReactNode;
16
+ //# sourceMappingURL=grid-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-view.d.ts","sourceRoot":"","sources":["../src/grid-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;AAWhD;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAEpH;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAAE,OAAO,sBAAsB,CAAC,CAAC,CAAC,KAAG,SA2CxE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { GtkGridView } 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 modelBinding = {
9
+ install: (widget, model) => widget.setModel(model),
10
+ };
11
+ /**
12
+ * A `GtkGridView` driven by a declarative `items`/`renderItem` API with
13
+ * optional controlled selection. Supplying an external `model` switches to the
14
+ * uncontrolled form.
15
+ */
16
+ export const GridView = (props) => {
17
+ const { ref, items, model, renderItem, selected, selectionMode, onSelectionChanged, estimatedItemHeight, estimatedItemWidth, ...intrinsicProps } = props;
18
+ const renderItemFn = renderItem;
19
+ const slotRenderer = (value, _treeRow, isHeader) => isHeader ? null : renderItemFn(value);
20
+ return (_jsx(CollectionView, { element: GtkGridView, intrinsicProps: intrinsicProps, ref: ref, items: model === undefined ? items : undefined, model: model, renderItem: slotRenderer, autoexpand: undefined, renderHeader: undefined, estimatedHeight: estimatedItemHeight, estimatedWidth: estimatedItemWidth, selected: selected, selectionMode: selectionMode, onSelectionChanged: onSelectionChanged, factoryBinding: factoryBinding, headerFactoryBinding: undefined, modelBinding: modelBinding }));
21
+ };
22
+ //# sourceMappingURL=grid-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-view.js","sourceRoot":"","sources":["../src/grid-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,YAAY,GAA+B;IAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAA2B,CAAC;CAC3E,CAAC;AASF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAc,KAAgC,EAAa,EAAE;IACjF,MAAM,EACF,GAAG,EACH,KAAK,EACL,KAAK,EACL,UAAU,EACV,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,GAAG,cAAc,EACpB,GAAG,KAKH,CAAC;IAEF,MAAM,YAAY,GAAG,UAAoC,CAAC;IAC1D,MAAM,YAAY,GAA6B,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CACzE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAU,CAAC,CAAC;IAE/C,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,SAAS,EACrB,YAAY,EAAE,SAAS,EACvB,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,EAC/B,YAAY,EAAE,YAAY,GAC5B,CACL,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import { type GObjectTarget } from "@gtkx/react/internal";
3
+ import type { ItemResolver } from "../utils/item-resolver.js";
4
+ export interface DropDownSelectionTarget extends GObject.Object {
5
+ getSelected(): number;
6
+ setSelected(position: number): void;
7
+ }
8
+ export interface DropDownSelectionOptions<T, S> {
9
+ widget: GObjectTarget<DropDownSelectionTarget>;
10
+ resolver: ItemResolver<T, S>;
11
+ selectedId: string | null | undefined;
12
+ onSelectionChanged: ((id: string) => void) | null | undefined;
13
+ }
14
+ export declare const useDropDownSelection: <T, S>(options: DropDownSelectionOptions<T, S>) => number;
15
+ //# sourceMappingURL=use-drop-down-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-drop-down-selection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-drop-down-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,KAAK,aAAa,EAA4C,MAAM,sBAAsB,CAAC;AAEpG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,uBAAwB,SAAQ,OAAO,CAAC,MAAM;IAC3D,WAAW,IAAI,MAAM,CAAC;IACtB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IAC/C,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CACjE;AAOD,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,EAAE,SAAS,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,MA6BpF,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { useSignal } from "@gtkx/react";
2
+ import { resolveGobjectTarget, useGObjectSnapshot } from "@gtkx/react/internal";
3
+ import { useLayoutEffect, useRef } from "react";
4
+ const GTK_INVALID_LIST_POSITION = 4294967295;
5
+ const normalizeSelected = (position) => position === GTK_INVALID_LIST_POSITION || position < 0 ? -1 : position;
6
+ export const useDropDownSelection = (options) => {
7
+ const { widget, resolver, selectedId, onSelectionChanged } = options;
8
+ const resolved = resolveGobjectTarget(widget);
9
+ const selectedPosition = useGObjectSnapshot(widget, "notify::selected", (target) => target === null ? -1 : normalizeSelected(target.getSelected()));
10
+ const resolverRef = useRef(resolver);
11
+ resolverRef.current = resolver;
12
+ const onSelectionChangedRef = useRef(onSelectionChanged);
13
+ onSelectionChangedRef.current = onSelectionChanged;
14
+ useLayoutEffect(() => {
15
+ if (resolved === null || selectedId === undefined || selectedId === null)
16
+ return;
17
+ const position = resolverRef.current.positionOf(selectedId);
18
+ if (position < 0)
19
+ return;
20
+ if (normalizeSelected(resolved.getSelected()) !== position)
21
+ resolved.setSelected(position);
22
+ }, [resolved, selectedId, resolver]);
23
+ useSignal(widget, "notify::selected", () => {
24
+ if (resolved === null)
25
+ return;
26
+ const position = normalizeSelected(resolved.getSelected());
27
+ if (position < 0)
28
+ return;
29
+ const id = resolverRef.current.idOf(position);
30
+ if (id !== undefined)
31
+ onSelectionChangedRef.current?.(id);
32
+ });
33
+ return selectedPosition;
34
+ };
35
+ //# sourceMappingURL=use-drop-down-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-drop-down-selection.js","sourceRoot":"","sources":["../../src/hooks/use-drop-down-selection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAsB,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAehD,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAE7C,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE,CACnD,QAAQ,KAAK,yBAAyB,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAE3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAO,OAAuC,EAAU,EAAE;IAC1F,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE9C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC/E,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CACjE,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC/B,MAAM,qBAAqB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzD,qBAAqB,CAAC,OAAO,GAAG,kBAAkB,CAAC;IAEnD,eAAe,CAAC,GAAG,EAAE;QACjB,IAAI,QAAQ,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO;QACjF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO;QACzB,IAAI,iBAAiB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,QAAQ;YAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/F,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErC,SAAS,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE;QACvC,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO;QAC9B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO;QACzB,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,EAAE,KAAK,SAAS;YAAE,qBAAqB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC;AAC5B,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type * as Gtk from "@gtkx/gi/gtk";
2
+ import { type ReactNode } from "react";
3
+ export declare const useHeaderMenu: (column: Gtk.ColumnViewColumn | null, headerMenu: ReactNode) => ReactNode;
4
+ //# sourceMappingURL=use-header-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-header-menu.d.ts","sourceRoot":"","sources":["../../src/hooks/use-header-menu.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,KAAK,SAAS,EAA2B,MAAM,OAAO,CAAC;AAShE,eAAO,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,gBAAgB,GAAG,IAAI,EAAE,YAAY,SAAS,KAAG,SAkB1F,CAAC"}
@@ -0,0 +1,32 @@
1
+ import * as Gio from "@gtkx/gi/gio";
2
+ import * as GObject from "@gtkx/gi/gobject";
3
+ import { createPortal } from "@gtkx/react";
4
+ import { stateOf } from "@gtkx/react/internal";
5
+ import { useLayoutEffect, useRef } from "react";
6
+ const findMenuModel = (container) => {
7
+ for (const child of stateOf(container).children) {
8
+ if (child instanceof Gio.MenuModel)
9
+ return child;
10
+ }
11
+ return null;
12
+ };
13
+ export const useHeaderMenu = (column, headerMenu) => {
14
+ const containerRef = useRef(null);
15
+ if (containerRef.current === null) {
16
+ containerRef.current = new GObject.Object();
17
+ }
18
+ const container = containerRef.current;
19
+ useLayoutEffect(() => {
20
+ if (column === null)
21
+ return;
22
+ if (headerMenu === undefined || headerMenu === null) {
23
+ column.setHeaderMenu(null);
24
+ return;
25
+ }
26
+ column.setHeaderMenu(findMenuModel(container));
27
+ });
28
+ if (headerMenu === undefined || headerMenu === null)
29
+ return null;
30
+ return createPortal(headerMenu, container, "header-menu");
31
+ };
32
+ //# sourceMappingURL=use-header-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-header-menu.js","sourceRoot":"","sources":["../../src/hooks/use-header-menu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAkB,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,aAAa,GAAG,CAAC,SAAyB,EAAwB,EAAE;IACtE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9C,IAAI,KAAK,YAAY,GAAG,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAmC,EAAE,UAAqB,EAAa,EAAE;IACnG,MAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAChC,YAAY,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;IAEvC,eAAe,CAAC,GAAG,EAAE;QACjB,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACX,CAAC;QACD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC9D,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type * as Gio from "@gtkx/gi/gio";
2
+ import type { ListItem } from "../types.js";
3
+ import { type ItemResolver } from "../utils/item-resolver.js";
4
+ export interface ControlledListMode<T, S> {
5
+ items: ListItem<T, S>[] | undefined;
6
+ autoexpand?: boolean | undefined;
7
+ model?: never;
8
+ }
9
+ export interface UncontrolledListMode {
10
+ model: Gio.ListModel;
11
+ items?: never;
12
+ autoexpand?: never;
13
+ }
14
+ export interface ListModelResult<T, S> {
15
+ model: Gio.ListModel;
16
+ resolver: ItemResolver<T, S>;
17
+ headerResolver: ItemResolver<T, S>;
18
+ }
19
+ export declare const useListModel: <T, S>(mode: ControlledListMode<T, S> | UncontrolledListMode) => ListModelResult<T, S>;
20
+ //# sourceMappingURL=use-list-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-list-model.d.ts","sourceRoot":"","sources":["../../src/hooks/use-list-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAIzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAIH,KAAK,YAAY,EAEpB,MAAM,2BAA2B,CAAC;AAUnC,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,EAAE,CAAC;IACjC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC;IACrB,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,cAAc,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACtC;AAiGD,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,oBAAoB,KAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAQ9G,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { useLayoutEffect, useMemo, useRef } from "react";
2
+ import { createControlledResolver, createModelResolver, createSectionHeaderResolver, } from "../utils/item-resolver.js";
3
+ import { detectStructure, structuralSignature } from "../utils/list-item-flatten.js";
4
+ import { createFlatModel, createSectionModel, createTreeModel, resizeFlatModel, retagRows, } from "../utils/position-only-model.js";
5
+ const controlledSignature = (structure, autoexpand, items) => (structure === "flat" ? "" : `${structure}|${autoexpand ? 1 : 0}|${structuralSignature(items)}`);
6
+ const buildControlledState = (items, autoexpand, structure, signature) => {
7
+ const rowValues = new WeakMap();
8
+ const placeholdersById = new Map();
9
+ let model;
10
+ let flatModel;
11
+ if (structure === "sections") {
12
+ model = createSectionModel(items ?? []);
13
+ }
14
+ else if (structure === "tree") {
15
+ model = createTreeModel(items ?? [], autoexpand, rowValues, placeholdersById);
16
+ }
17
+ else {
18
+ flatModel = createFlatModel(items?.length ?? 0);
19
+ model = flatModel;
20
+ }
21
+ return { model, flatModel, items, structure, autoexpand, signature, rowValues, placeholdersById };
22
+ };
23
+ const resolveControlledState = (prev, items, autoexpand) => {
24
+ if (prev !== null && prev.items === items && prev.autoexpand === autoexpand)
25
+ return prev;
26
+ const structure = detectStructure(items);
27
+ const signature = controlledSignature(structure, autoexpand, items);
28
+ if (prev === null || prev.structure !== structure) {
29
+ return buildControlledState(items, autoexpand, structure, signature);
30
+ }
31
+ if (structure !== "flat" && prev.signature !== signature) {
32
+ return buildControlledState(items, autoexpand, structure, signature);
33
+ }
34
+ if (structure !== "flat") {
35
+ retagRows(items ?? [], prev.rowValues, prev.placeholdersById);
36
+ }
37
+ prev.items = items;
38
+ prev.autoexpand = autoexpand;
39
+ prev.signature = signature;
40
+ return prev;
41
+ };
42
+ const useControlledModel = (mode) => {
43
+ const { items } = mode;
44
+ const autoexpand = mode.autoexpand ?? false;
45
+ const stateRef = useRef(null);
46
+ const state = resolveControlledState(stateRef.current, items, autoexpand);
47
+ stateRef.current = state;
48
+ const { structure, flatModel } = state;
49
+ useLayoutEffect(() => {
50
+ if (flatModel !== undefined) {
51
+ resizeFlatModel(flatModel, items?.length ?? 0);
52
+ }
53
+ }, [flatModel, items]);
54
+ const resolver = useMemo(() => createControlledResolver(items, structure !== "flat" && autoexpand, state.rowValues), [items, structure, autoexpand, state.rowValues]);
55
+ const headerResolver = useMemo(() => createSectionHeaderResolver(structure === "sections" ? items : undefined), [items, structure]);
56
+ return { model: state.model, resolver, headerResolver };
57
+ };
58
+ const useUncontrolledModel = (mode) => {
59
+ const { model } = mode;
60
+ const resolver = useMemo(() => createModelResolver(model), [model]);
61
+ const headerResolver = useMemo(() => createSectionHeaderResolver(undefined), []);
62
+ return { model, resolver, headerResolver };
63
+ };
64
+ export const useListModel = (mode) => {
65
+ const controlled = useControlledModel(mode.model === undefined ? { items: mode.items, autoexpand: mode.autoexpand } : { items: [] });
66
+ const uncontrolled = useUncontrolledModel(mode.model === undefined ? { model: EMPTY_MODEL } : { model: mode.model });
67
+ return mode.model === undefined ? controlled : uncontrolled;
68
+ };
69
+ const EMPTY_MODEL = createFlatModel(0);
70
+ //# sourceMappingURL=use-list-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-list-model.js","sourceRoot":"","sources":["../../src/hooks/use-list-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type * as Gtk from "@gtkx/gi/gtk";
2
+ import { type RefObject } from "react";
3
+ /**
4
+ * Installs `model` onto the realized GTK widget referenced by `target` through
5
+ * the `install` callback, re-running whenever the widget or model identity
6
+ * changes and tolerating the widget being realized after mount.
7
+ */
8
+ export declare const useModelInstallation: <W extends Gtk.Widget, M>(target: RefObject<W | null>, model: M, install: (widget: W, model: M) => void) => void;
9
+ //# sourceMappingURL=use-model-installation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-model-installation.d.ts","sourceRoot":"","sources":["../../src/hooks/use-model-installation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,EACxD,QAAQ,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAC3B,OAAO,CAAC,EACR,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,KACvC,IAWF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { useTargetRegistration } from "@gtkx/react/internal";
2
+ import { useRef } from "react";
3
+ /**
4
+ * Installs `model` onto the realized GTK widget referenced by `target` through
5
+ * the `install` callback, re-running whenever the widget or model identity
6
+ * changes and tolerating the widget being realized after mount.
7
+ */
8
+ export const useModelInstallation = (target, model, install) => {
9
+ const installRef = useRef(install);
10
+ installRef.current = install;
11
+ useTargetRegistration(target, {
12
+ attach: (widget) => {
13
+ installRef.current(widget, model);
14
+ return { widget, model };
15
+ },
16
+ detach: () => { },
17
+ isSame: (registration, widget) => registration.widget === widget && registration.model === model,
18
+ });
19
+ };
20
+ //# sourceMappingURL=use-model-installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-model-installation.js","sourceRoot":"","sources":["../../src/hooks/use-model-installation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,MAA2B,EAC3B,KAAQ,EACR,OAAsC,EAClC,EAAE;IACN,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,qBAAqB,CAA6B,MAAM,EAAE;QACtD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YACf,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;QAChB,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,KAAK,MAAM,IAAI,YAAY,CAAC,KAAK,KAAK,KAAK;KACnG,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import * as Gtk from "@gtkx/gi/gtk";
3
+ import { type GObjectTarget } from "@gtkx/react/internal";
4
+ import { RealizedSlotStore } from "../utils/realized-slot-store.js";
5
+ export interface FactoryBinding<W extends GObject.Object> {
6
+ install(widget: W, factory: Gtk.SignalListItemFactory): void;
7
+ uninstall(widget: W, factory: Gtk.SignalListItemFactory): void;
8
+ }
9
+ export interface RealizedSlotsOptions<W extends GObject.Object> {
10
+ target: GObjectTarget<W>;
11
+ binding: FactoryBinding<W>;
12
+ estimatedHeight?: number | undefined;
13
+ estimatedWidth?: number | undefined;
14
+ }
15
+ export interface RealizedSlots {
16
+ factory: Gtk.SignalListItemFactory;
17
+ store: RealizedSlotStore;
18
+ }
19
+ export declare const useRealizedSlots: <W extends GObject.Object>(options: RealizedSlotsOptions<W>) => RealizedSlots;
20
+ //# sourceMappingURL=use-realized-slots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-realized-slots.d.ts","sourceRoot":"","sources":["../../src/hooks/use-realized-slots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,KAAK,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAiBpE,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM;IACpD,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAC7D,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM;IAC1D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,GAAG,CAAC,qBAAqB,CAAC;IACnC,KAAK,EAAE,iBAAiB,CAAC;CAC5B;AAOD,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,oBAAoB,CAAC,CAAC,CAAC,KAAG,aAiD7F,CAAC"}
@@ -0,0 +1,66 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ import { useTargetRegistration } from "@gtkx/react/internal";
3
+ import { useRef } from "react";
4
+ import { RealizedSlotStore } from "../utils/realized-slot-store.js";
5
+ const isChildContainer = (container) => container instanceof Gtk.ListItem || container instanceof Gtk.ListHeader;
6
+ const positionOf = (container) => {
7
+ if (container instanceof Gtk.ListItem)
8
+ return container.getPosition();
9
+ if (container instanceof Gtk.ListHeader)
10
+ return container.getStart();
11
+ return -1;
12
+ };
13
+ const applyEstimatedSize = (child, height, width) => {
14
+ if (height === undefined && width === undefined)
15
+ return;
16
+ child.setSizeRequest(width ?? -1, height ?? -1);
17
+ };
18
+ export const useRealizedSlots = (options) => {
19
+ const { target, binding, estimatedHeight, estimatedWidth } = options;
20
+ const storeRef = useRef(null);
21
+ if (storeRef.current === null)
22
+ storeRef.current = new RealizedSlotStore();
23
+ const store = storeRef.current;
24
+ const bindingRef = useRef(binding);
25
+ bindingRef.current = binding;
26
+ const factoryRef = useRef(null);
27
+ if (factoryRef.current === null) {
28
+ const factory = Gtk.SignalListItemFactory.new();
29
+ factory.on("setup", (container) => {
30
+ if (isChildContainer(container) && container.getChild() === null) {
31
+ const placeholder = new Gtk.Box();
32
+ applyEstimatedSize(placeholder, estimatedHeight, estimatedWidth);
33
+ container.setChild(placeholder);
34
+ }
35
+ store.addContainer(container);
36
+ });
37
+ factory.on("bind", (container) => {
38
+ if (isChildContainer(container)) {
39
+ const item = container.getItem();
40
+ const treeRow = item instanceof Gtk.TreeListRow ? item : null;
41
+ store.bind(container, positionOf(container), treeRow, item);
42
+ }
43
+ else {
44
+ store.bind(container, -1, null, null);
45
+ }
46
+ });
47
+ factory.on("unbind", (container) => {
48
+ store.unbind(container);
49
+ });
50
+ factory.on("teardown", (container) => {
51
+ store.removeContainer(container);
52
+ });
53
+ factoryRef.current = factory;
54
+ }
55
+ const factory = factoryRef.current;
56
+ useTargetRegistration(target, {
57
+ attach: (widget) => {
58
+ bindingRef.current.install(widget, factory);
59
+ return { widget };
60
+ },
61
+ detach: (registration) => bindingRef.current.uninstall(registration.widget, factory),
62
+ isSame: (registration, widget) => registration.widget === widget,
63
+ });
64
+ return { factory, store };
65
+ };
66
+ //# sourceMappingURL=use-realized-slots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-realized-slots.js","sourceRoot":"","sources":["../../src/hooks/use-realized-slots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type * as Gio from "@gtkx/gi/gio";
2
+ import * as Gtk from "@gtkx/gi/gtk";
3
+ import type { ItemResolver } from "../utils/item-resolver.js";
4
+ export interface SelectionModelOptions<T, S> {
5
+ base: Gio.ListModel;
6
+ selectionMode: Gtk.SelectionMode | null | undefined;
7
+ selected: string[] | null | undefined;
8
+ onSelectionChanged: ((ids: string[]) => void) | null | undefined;
9
+ resolver: ItemResolver<T, S>;
10
+ }
11
+ export declare const useSelectionModel: <T, S>(options: SelectionModelOptions<T, S>) => Gtk.SelectionModel;
12
+ //# sourceMappingURL=use-selection-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-selection-model.d.ts","sourceRoot":"","sources":["../../src/hooks/use-selection-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC;IACvC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;IACpB,aAAa,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpD,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,kBAAkB,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACjE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAChC;AAsED,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,CAAC,EAAE,SAAS,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,GAAG,CAAC,cAsClF,CAAC"}