@gtkx/components 0.21.0 → 1.0.0-rc.1
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.
- package/LICENSE +373 -0
- package/README.md +173 -0
- package/dist/cell.d.ts +30 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +45 -0
- package/dist/cell.js.map +1 -0
- package/dist/column-view-column.d.ts +24 -14
- package/dist/column-view-column.d.ts.map +1 -1
- package/dist/column-view-column.js +19 -40
- package/dist/column-view-column.js.map +1 -1
- package/dist/column-view.d.ts +25 -11
- package/dist/column-view.d.ts.map +1 -1
- package/dist/column-view.js +53 -83
- package/dist/column-view.js.map +1 -1
- package/dist/constraint-layout-apply.d.ts +50 -1
- package/dist/constraint-layout-apply.d.ts.map +1 -1
- package/dist/constraint-layout-apply.js.map +1 -1
- package/dist/constraint-layout.d.ts +8 -1
- package/dist/constraint-layout.d.ts.map +1 -1
- package/dist/constraint-layout.js +12 -9
- package/dist/constraint-layout.js.map +1 -1
- package/dist/drop-down.d.ts +26 -36
- package/dist/drop-down.d.ts.map +1 -1
- package/dist/drop-down.js +47 -87
- package/dist/drop-down.js.map +1 -1
- package/dist/fixed.d.ts +26 -0
- package/dist/fixed.d.ts.map +1 -0
- package/dist/fixed.js +40 -0
- package/dist/fixed.js.map +1 -0
- package/dist/grid-view.d.ts +13 -10
- package/dist/grid-view.d.ts.map +1 -1
- package/dist/grid-view.js +30 -16
- package/dist/grid-view.js.map +1 -1
- package/dist/grid.d.ts +27 -0
- package/dist/grid.d.ts.map +1 -0
- package/dist/grid.js +48 -0
- package/dist/grid.js.map +1 -0
- package/dist/hooks/use-cell-containers.d.ts +18 -0
- package/dist/hooks/use-cell-containers.d.ts.map +1 -0
- package/dist/hooks/{use-realized-slots.js → use-cell-containers.js} +18 -17
- package/dist/hooks/use-cell-containers.js.map +1 -0
- package/dist/hooks/use-collection-model.d.ts +26 -0
- package/dist/hooks/use-collection-model.d.ts.map +1 -0
- package/dist/hooks/use-collection-model.js +35 -0
- package/dist/hooks/use-collection-model.js.map +1 -0
- package/dist/hooks/use-collection-widget.d.ts +28 -0
- package/dist/hooks/use-collection-widget.d.ts.map +1 -0
- package/dist/hooks/use-collection-widget.js +21 -0
- package/dist/hooks/use-collection-widget.js.map +1 -0
- package/dist/hooks/use-drop-down-selection.d.ts +7 -6
- package/dist/hooks/use-drop-down-selection.d.ts.map +1 -1
- package/dist/hooks/use-drop-down-selection.js +6 -6
- package/dist/hooks/use-drop-down-selection.js.map +1 -1
- package/dist/hooks/use-expansion-model.d.ts +12 -0
- package/dist/hooks/use-expansion-model.d.ts.map +1 -0
- package/dist/hooks/use-expansion-model.js +71 -0
- package/dist/hooks/use-expansion-model.js.map +1 -0
- package/dist/hooks/use-header-menu.d.ts.map +1 -1
- package/dist/hooks/use-header-menu.js +12 -24
- package/dist/hooks/use-header-menu.js.map +1 -1
- package/dist/hooks/use-installed-model.d.ts +4 -0
- package/dist/hooks/use-installed-model.d.ts.map +1 -0
- package/dist/hooks/use-installed-model.js +15 -0
- package/dist/hooks/use-installed-model.js.map +1 -0
- package/dist/hooks/use-list-model.d.ts +14 -15
- package/dist/hooks/use-list-model.d.ts.map +1 -1
- package/dist/hooks/use-list-model.js +61 -34
- package/dist/hooks/use-list-model.js.map +1 -1
- package/dist/hooks/use-placed-child.d.ts +18 -0
- package/dist/hooks/use-placed-child.d.ts.map +1 -0
- package/dist/hooks/use-placed-child.js +47 -0
- package/dist/hooks/use-placed-child.js.map +1 -0
- package/dist/hooks/use-selection-model.d.ts +4 -3
- package/dist/hooks/use-selection-model.d.ts.map +1 -1
- package/dist/hooks/use-selection-model.js +8 -16
- package/dist/hooks/use-selection-model.js.map +1 -1
- package/dist/hooks/use-sort-handler.d.ts +10 -5
- package/dist/hooks/use-sort-handler.d.ts.map +1 -1
- package/dist/hooks/use-sort-handler.js +2 -2
- package/dist/hooks/use-sort-handler.js.map +1 -1
- package/dist/index.d.ts +11 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -13
- package/dist/index.js.map +1 -1
- package/dist/list-view.d.ts +17 -9
- package/dist/list-view.d.ts.map +1 -1
- package/dist/list-view.js +49 -24
- package/dist/list-view.js.map +1 -1
- package/dist/menu-items.d.ts.map +1 -1
- package/dist/menu-items.js.map +1 -1
- package/dist/menu.d.ts +6 -10
- package/dist/menu.d.ts.map +1 -1
- package/dist/menu.js +7 -9
- package/dist/menu.js.map +1 -1
- package/dist/overlay.d.ts +24 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +49 -0
- package/dist/overlay.js.map +1 -0
- package/dist/size-group.d.ts +20 -0
- package/dist/size-group.d.ts.map +1 -0
- package/dist/size-group.js +57 -0
- package/dist/size-group.js.map +1 -0
- package/dist/types.d.ts +43 -173
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/{realized-slot-store.d.ts → cell-container-store.d.ts} +7 -9
- package/dist/utils/cell-container-store.d.ts.map +1 -0
- package/dist/utils/{realized-slot-store.js → cell-container-store.js} +9 -14
- package/dist/utils/cell-container-store.js.map +1 -0
- package/dist/utils/item-models.d.ts +10 -0
- package/dist/utils/item-models.d.ts.map +1 -0
- package/dist/utils/{position-only-model.js → item-models.js} +13 -14
- package/dist/utils/item-models.js.map +1 -0
- package/dist/utils/item-resolver.d.ts +14 -17
- package/dist/utils/item-resolver.d.ts.map +1 -1
- package/dist/utils/item-resolver.js +34 -43
- package/dist/utils/item-resolver.js.map +1 -1
- package/dist/utils/list-item-flatten.d.ts +16 -24
- package/dist/utils/list-item-flatten.d.ts.map +1 -1
- package/dist/utils/list-item-flatten.js +16 -36
- package/dist/utils/list-item-flatten.js.map +1 -1
- package/package.json +52 -53
- package/src/cell.tsx +144 -0
- package/src/column-view-column.tsx +57 -48
- package/src/column-view.tsx +130 -146
- package/src/constraint-layout-apply.ts +53 -1
- package/src/constraint-layout.tsx +18 -13
- package/src/drop-down.tsx +129 -196
- package/src/fixed.tsx +86 -0
- package/src/grid-view.tsx +52 -44
- package/src/grid.tsx +88 -0
- package/src/hooks/{use-realized-slots.ts → use-cell-containers.ts} +30 -30
- package/src/hooks/use-collection-model.ts +60 -0
- package/src/hooks/use-collection-widget.ts +47 -0
- package/src/hooks/use-drop-down-selection.ts +12 -13
- package/src/hooks/use-expansion-model.ts +82 -0
- package/src/hooks/use-header-menu.ts +24 -23
- package/src/hooks/use-installed-model.ts +20 -0
- package/src/hooks/use-list-model.ts +103 -87
- package/src/hooks/use-placed-child.ts +79 -0
- package/src/hooks/use-selection-model.ts +11 -18
- package/src/hooks/use-sort-handler.ts +13 -8
- package/src/index.ts +25 -27
- package/src/list-view.tsx +120 -57
- package/src/menu.tsx +12 -14
- package/src/overlay.tsx +88 -0
- package/src/size-group.tsx +96 -0
- package/src/types.ts +55 -206
- package/src/utils/{realized-slot-store.ts → cell-container-store.ts} +13 -25
- package/src/utils/{position-only-model.ts → item-models.ts} +26 -28
- package/src/utils/item-resolver.ts +54 -59
- package/src/utils/list-item-flatten.ts +33 -56
- package/dist/collection-view.d.ts +0 -30
- package/dist/collection-view.d.ts.map +0 -1
- package/dist/collection-view.js +0 -52
- package/dist/collection-view.js.map +0 -1
- package/dist/contexts/column-view-context.d.ts +0 -17
- package/dist/contexts/column-view-context.d.ts.map +0 -1
- package/dist/contexts/column-view-context.js +0 -10
- package/dist/contexts/column-view-context.js.map +0 -1
- package/dist/hooks/use-model-installation.d.ts +0 -9
- package/dist/hooks/use-model-installation.d.ts.map +0 -1
- package/dist/hooks/use-model-installation.js +0 -20
- package/dist/hooks/use-model-installation.js.map +0 -1
- package/dist/hooks/use-realized-slots.d.ts +0 -20
- package/dist/hooks/use-realized-slots.d.ts.map +0 -1
- package/dist/hooks/use-realized-slots.js.map +0 -1
- package/dist/list-portal-host.d.ts +0 -11
- package/dist/list-portal-host.d.ts.map +0 -1
- package/dist/list-portal-host.js +0 -8
- package/dist/list-portal-host.js.map +0 -1
- package/dist/list-slot.d.ts +0 -14
- package/dist/list-slot.d.ts.map +0 -1
- package/dist/list-slot.js +0 -29
- package/dist/list-slot.js.map +0 -1
- package/dist/utils/position-only-model.d.ts +0 -10
- package/dist/utils/position-only-model.d.ts.map +0 -1
- package/dist/utils/position-only-model.js.map +0 -1
- package/dist/utils/realized-slot-store.d.ts.map +0 -1
- package/dist/utils/realized-slot-store.js.map +0 -1
- package/src/collection-view.tsx +0 -125
- package/src/contexts/column-view-context.ts +0 -28
- package/src/hooks/use-model-installation.ts +0 -25
- package/src/list-portal-host.tsx +0 -27
- package/src/list-slot.tsx +0 -56
package/dist/list-view.js
CHANGED
|
@@ -1,31 +1,56 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { GtkListView } from "@gtkx/jsx/gtk";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
import { CellRenderHost, createTreeRenderContext, HeaderRenderHost, itemRenderer, } from "./cell.js";
|
|
4
|
+
import { makeFactoryInstaller, useCellContainers } from "./hooks/use-cell-containers.js";
|
|
5
|
+
import { useCollectionWidget } from "./hooks/use-collection-widget.js";
|
|
6
|
+
const factoryInstaller = makeFactoryInstaller((widget, factory) => widget.setFactory(factory));
|
|
7
|
+
const headerFactoryInstaller = makeFactoryInstaller((widget, factory) => widget.setHeaderFactory(factory));
|
|
8
|
+
const useListViewWiring = (props) => {
|
|
9
|
+
const { widgetRef, setRef, collection } = useCollectionWidget(props);
|
|
10
|
+
const useHeader = collection.useHeader;
|
|
11
|
+
const itemStore = useCellContainers({
|
|
12
|
+
object: widgetRef,
|
|
13
|
+
installer: factoryInstaller,
|
|
14
|
+
estimatedHeight: props.estimatedItemHeight,
|
|
15
|
+
estimatedWidth: props.estimatedItemWidth,
|
|
16
|
+
});
|
|
17
|
+
const headerStore = useCellContainers({
|
|
18
|
+
object: useHeader ? widgetRef : null,
|
|
19
|
+
installer: headerFactoryInstaller,
|
|
20
|
+
estimatedHeight: props.estimatedItemHeight,
|
|
21
|
+
estimatedWidth: props.estimatedItemWidth,
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
setRef,
|
|
25
|
+
resolver: collection.resolver,
|
|
26
|
+
headerResolver: collection.headerResolver,
|
|
27
|
+
itemStore,
|
|
28
|
+
headerStore,
|
|
29
|
+
useHeader,
|
|
30
|
+
rowId: collection.rowId,
|
|
31
|
+
};
|
|
14
32
|
};
|
|
15
33
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Supplying an external `model` switches to the uncontrolled form.
|
|
34
|
+
* Renders a Gtk.ListView: a scrollable, single-column list backed by a collection
|
|
35
|
+
* model, with each row drawn by renderItem and optional section headers.
|
|
19
36
|
*/
|
|
20
37
|
export const ListView = (props) => {
|
|
21
|
-
const { ref, items,
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
38
|
+
const { ref, items, sections, renderItem, renderHeader, selectedIds, selectionMode, onSelectionChanged, expandedIds, onExpandedChange, estimatedItemHeight, estimatedItemWidth, ...intrinsicProps } = props;
|
|
39
|
+
const wiring = useListViewWiring({
|
|
40
|
+
ref,
|
|
41
|
+
items,
|
|
42
|
+
sections,
|
|
43
|
+
renderHeader,
|
|
44
|
+
selectedIds,
|
|
45
|
+
selectionMode,
|
|
46
|
+
onSelectionChanged,
|
|
47
|
+
expandedIds,
|
|
48
|
+
onExpandedChange,
|
|
49
|
+
estimatedItemHeight,
|
|
50
|
+
estimatedItemWidth,
|
|
51
|
+
});
|
|
52
|
+
const treeContext = createTreeRenderContext(expandedIds, wiring.rowId);
|
|
53
|
+
const cellRenderer = itemRenderer(renderItem, treeContext);
|
|
54
|
+
return (_jsxs(_Fragment, { children: [_jsx(GtkListView, { ...intrinsicProps, ref: wiring.setRef }), _jsx(CellRenderHost, { store: wiring.itemStore, resolver: wiring.resolver, render: cellRenderer }), _jsx(HeaderRenderHost, { useHeader: wiring.useHeader, store: wiring.headerStore, resolver: wiring.headerResolver, renderHeader: renderHeader })] }));
|
|
30
55
|
};
|
|
31
56
|
//# sourceMappingURL=list-view.js.map
|
package/dist/list-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-view.js","sourceRoot":"","sources":["../src/list-view.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"list-view.js","sourceRoot":"","sources":["../src/list-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { GtkListView, type GtkListViewProps } from \"@gtkx/jsx/gtk\";\nimport type { ReactNode, Ref } from \"react\";\nimport {\n type CellRenderer,\n CellRenderHost,\n createTreeRenderContext,\n HeaderRenderHost,\n itemRenderer,\n type TreeRenderContext,\n} from \"./cell.js\";\nimport { makeFactoryInstaller, useCellContainers } from \"./hooks/use-cell-containers.js\";\nimport { useCollectionWidget } from \"./hooks/use-collection-widget.js\";\nimport type {\n CollectionItemSizeProps,\n ControlledExpansionProps,\n ControlledSelectionProps,\n ItemNode,\n RenderItemProps,\n SectionNode,\n} from \"./types.js\";\nimport type { CellContainerStore } from \"./utils/cell-container-store.js\";\nimport type { ItemResolver } from \"./utils/item-resolver.js\";\n\nconst factoryInstaller = makeFactoryInstaller<Gtk.ListView>((widget, factory) => widget.setFactory(factory));\n\nconst headerFactoryInstaller = makeFactoryInstaller<Gtk.ListView>((widget, factory) =>\n widget.setHeaderFactory(factory),\n);\n\nexport type ListViewDeclarativeProps<T = unknown, S = unknown> = CollectionItemSizeProps &\n ControlledSelectionProps &\n ControlledExpansionProps & {\n items?: ItemNode<T>[] | undefined;\n sections?: SectionNode<S, T>[] | undefined;\n renderItem: (props: RenderItemProps<T>) => ReactNode;\n renderHeader?: ((info: { section: S }) => ReactNode) | null | undefined;\n };\n\n/**\n * Props for {@link ListView}. Combines the underlying Gtk.ListView props with\n * declarative collection props: flat items or grouped sections, a per-row renderItem,\n * an optional section header renderer, controlled selection and expansion, and\n * estimated item sizing.\n */\nexport type ListViewProps<T = unknown, S = unknown> = Omit<\n GtkListViewProps,\n \"model\" | \"factory\" | \"headerFactory\" | keyof ListViewDeclarativeProps<T, S>\n> &\n ListViewDeclarativeProps<T, S>;\n\ninterface ListViewWiring<T, S> {\n setRef: (value: Gtk.ListView | null) => void;\n resolver: ItemResolver<T, S>;\n headerResolver: ItemResolver<T, S>;\n itemStore: CellContainerStore;\n headerStore: CellContainerStore;\n useHeader: boolean;\n rowId: (row: Gtk.TreeListRow) => string | undefined;\n}\n\nconst useListViewWiring = <T, S>(props: NormalizedListViewProps<T, S>): ListViewWiring<T, S> => {\n const { widgetRef, setRef, collection } = useCollectionWidget<Gtk.ListView, T, S>(props);\n\n const useHeader = collection.useHeader;\n\n const itemStore = useCellContainers<Gtk.ListView>({\n object: widgetRef,\n installer: factoryInstaller,\n estimatedHeight: props.estimatedItemHeight,\n estimatedWidth: props.estimatedItemWidth,\n });\n const headerStore = useCellContainers<Gtk.ListView>({\n object: useHeader ? widgetRef : null,\n installer: headerFactoryInstaller,\n estimatedHeight: props.estimatedItemHeight,\n estimatedWidth: props.estimatedItemWidth,\n });\n\n return {\n setRef,\n resolver: collection.resolver,\n headerResolver: collection.headerResolver,\n itemStore,\n headerStore,\n useHeader,\n rowId: collection.rowId,\n };\n};\n\ntype NormalizedListViewProps<T, S> = ListViewDeclarativeProps<T, S> & {\n ref?: Ref<Gtk.ListView | null>;\n estimatedItemHeight?: number;\n estimatedItemWidth?: number;\n [key: string]: unknown;\n};\n\n/**\n * Renders a Gtk.ListView: a scrollable, single-column list backed by a collection\n * model, with each row drawn by renderItem and optional section headers.\n */\nexport const ListView = <T = unknown, S = unknown>(props: ListViewProps<T, S>): ReactNode => {\n const {\n ref,\n items,\n sections,\n renderItem,\n renderHeader,\n selectedIds,\n selectionMode,\n onSelectionChanged,\n expandedIds,\n onExpandedChange,\n estimatedItemHeight,\n estimatedItemWidth,\n ...intrinsicProps\n } = props as NormalizedListViewProps<T, S>;\n\n const wiring = useListViewWiring<T, S>({\n ref,\n items,\n sections,\n renderHeader,\n selectedIds,\n selectionMode,\n onSelectionChanged,\n expandedIds,\n onExpandedChange,\n estimatedItemHeight,\n estimatedItemWidth,\n } as NormalizedListViewProps<T, S>);\n\n const treeContext: TreeRenderContext = createTreeRenderContext(expandedIds, wiring.rowId);\n const cellRenderer: CellRenderer<T, S> = itemRenderer<T, S>(renderItem, treeContext);\n\n return (\n <>\n <GtkListView {...intrinsicProps} ref={wiring.setRef} />\n <CellRenderHost store={wiring.itemStore} resolver={wiring.resolver} render={cellRenderer} />\n <HeaderRenderHost\n useHeader={wiring.useHeader}\n store={wiring.headerStore}\n resolver={wiring.headerResolver}\n renderHeader={renderHeader}\n />\n </>\n );\n};\n"]}
|
package/dist/menu-items.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,SAAU,GAAG,CAAC,IAAI,WAAW,SAAS,EAAE,GAAG,IAAI,KAAG,IAG5E,CAAC;AAcF,eAAO,MAAM,cAAc,MAAO,SAAS,EAAE,GAAG,IAAI,KAAK,SAAS,EAAE,GAAG,IAAI,KAAG,OAI7E,CAAC"}
|
package/dist/menu-items.js.map
CHANGED
|
@@ -1 +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"}
|
|
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","sourcesContent":["import * as Gio from \"@gtkx/gi/gio\";\nimport type { MenuEntry } from \"./types.js\";\n\nconst buildMenuModel = (entries: MenuEntry[]): Gio.Menu => {\n const menu = new Gio.Menu();\n appendEntries(menu, entries);\n return menu;\n};\n\nconst appendEntries = (menu: Gio.Menu, entries: MenuEntry[]): void => {\n for (const entry of entries) {\n if (entry.section !== undefined) {\n menu.appendSection(entry.label ?? null, buildMenuModel(entry.section));\n continue;\n }\n if (entry.submenu !== undefined) {\n menu.appendSubmenu(entry.label ?? null, buildMenuModel(entry.submenu));\n continue;\n }\n const item = new Gio.MenuItem();\n if (entry.label !== undefined) item.setLabel(entry.label);\n if (entry.action !== undefined) item.setDetailedAction(entry.action);\n menu.appendItem(item);\n }\n};\n\nexport const applyMenuItems = (menu: Gio.Menu, entries: MenuEntry[] | null): void => {\n menu.removeAll();\n if (entries) appendEntries(menu, entries);\n};\n\nconst entryEqual = (a: MenuEntry, b: MenuEntry): boolean =>\n a.label === b.label &&\n a.action === b.action &&\n entryListEqual(a.submenu, b.submenu) &&\n entryListEqual(a.section, b.section);\n\nconst entryListEqual = (a: MenuEntry[] | undefined, b: MenuEntry[] | undefined): boolean => {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n return a.length === b.length && a.every((entry, index) => entryEqual(entry, b[index] as MenuEntry));\n};\n\nexport const menuItemsEqual = (a: MenuEntry[] | null, b: MenuEntry[] | null): boolean => {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return entryListEqual(a, b);\n};\n"]}
|
package/dist/menu.d.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import type * as Gio from "@gtkx/gi/gio";
|
|
2
2
|
import { type GMenuProps } from "@gtkx/jsx/gio";
|
|
3
3
|
import { type ReactNode, type Ref } from "react";
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
4
|
+
import type { MenuEntry } from "./types.js";
|
|
5
|
+
export type MenuItemsProps = {
|
|
6
|
+
items?: MenuEntry[] | null | undefined;
|
|
7
|
+
};
|
|
8
|
+
/** Props for {@link Menu}, combining Gio.Menu props with a declarative items array. */
|
|
9
9
|
export type MenuProps = Omit<GMenuProps, keyof MenuItemsProps> & MenuItemsProps & {
|
|
10
10
|
ref?: Ref<Gio.Menu | null>;
|
|
11
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
|
-
*/
|
|
12
|
+
/** Builds a Gio.Menu model from a declarative array of {@link MenuEntry} items. */
|
|
17
13
|
export declare const Menu: (props: MenuProps) => ReactNode;
|
|
18
14
|
//# sourceMappingURL=menu.d.ts.map
|
package/dist/menu.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAA2B,MAAM,OAAO,CAAC;AAE1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,uFAAuF;AACvF,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,mFAAmF;AACnF,eAAO,MAAM,IAAI,UAAW,SAAS,KAAG,SAgBvC,CAAC"}
|
package/dist/menu.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
2
|
import { GMenu } from "@gtkx/jsx/gio";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
3
|
+
import { useMergeRefs } from "@gtkx/react/internal";
|
|
4
|
+
import { useLayoutEffect, useRef } from "react";
|
|
4
5
|
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
|
-
*/
|
|
6
|
+
/** Builds a Gio.Menu model from a declarative array of {@link MenuEntry} items. */
|
|
10
7
|
export const Menu = (props) => {
|
|
11
8
|
const { items, ref, ...rest } = props;
|
|
12
|
-
const
|
|
9
|
+
const menuRef = useRef(null);
|
|
10
|
+
const mergedRef = useMergeRefs(ref, menuRef);
|
|
13
11
|
const appliedRef = useRef(null);
|
|
14
12
|
useLayoutEffect(() => {
|
|
15
13
|
const menu = menuRef.current;
|
|
@@ -21,6 +19,6 @@ export const Menu = (props) => {
|
|
|
21
19
|
appliedRef.current = entries;
|
|
22
20
|
applyMenuItems(menu, entries);
|
|
23
21
|
});
|
|
24
|
-
return
|
|
22
|
+
return _jsx(GMenu, { ...rest, ref: mergedRef });
|
|
25
23
|
};
|
|
26
24
|
//# sourceMappingURL=menu.js.map
|
package/dist/menu.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAmB,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAA4B,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAUjE,mFAAmF;AACnF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAgB,EAAa,EAAE;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7C,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,KAAC,KAAK,OAAK,IAAI,EAAE,GAAG,EAAE,SAAS,GAAI,CAAC;AAC/C,CAAC,CAAC","sourcesContent":["import type * as Gio from \"@gtkx/gi/gio\";\nimport { GMenu, type GMenuProps } from \"@gtkx/jsx/gio\";\nimport { useMergeRefs } from \"@gtkx/react/internal\";\nimport { type ReactNode, type Ref, useLayoutEffect, useRef } from \"react\";\nimport { applyMenuItems, menuItemsEqual } from \"./menu-items.js\";\nimport type { MenuEntry } from \"./types.js\";\n\nexport type MenuItemsProps = {\n items?: MenuEntry[] | null | undefined;\n};\n\n/** Props for {@link Menu}, combining Gio.Menu props with a declarative items array. */\nexport type MenuProps = Omit<GMenuProps, keyof MenuItemsProps> & MenuItemsProps & { ref?: Ref<Gio.Menu | null> };\n\n/** Builds a Gio.Menu model from a declarative array of {@link MenuEntry} items. */\nexport const Menu = (props: MenuProps): ReactNode => {\n const { items, ref, ...rest } = props;\n const menuRef = useRef<Gio.Menu | null>(null);\n const mergedRef = useMergeRefs(ref, menuRef);\n const appliedRef = useRef<MenuEntry[] | null>(null);\n\n useLayoutEffect(() => {\n const menu = menuRef.current;\n if (!menu) return;\n const entries = items ?? null;\n if (menuItemsEqual(appliedRef.current, entries)) return;\n appliedRef.current = entries;\n applyMenuItems(menu, entries);\n });\n\n return <GMenu {...rest} ref={mergedRef} />;\n};\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { type GtkOverlayProps } from "@gtkx/jsx/gtk";
|
|
3
|
+
import { type ElementType, type ReactNode, type Ref } from "react";
|
|
4
|
+
import type { ChildProps } from "./types.js";
|
|
5
|
+
/** Props for {@link Overlay}. */
|
|
6
|
+
export type OverlayProps = GtkOverlayProps & {
|
|
7
|
+
ref?: Ref<Gtk.Overlay | null>;
|
|
8
|
+
};
|
|
9
|
+
export type OverlayPlacementProps = {
|
|
10
|
+
/** Whether this overlay contributes to the Overlay's measured size. */
|
|
11
|
+
measure?: boolean | null | undefined;
|
|
12
|
+
/** Whether the overlay is clipped to the main child's allocation. */
|
|
13
|
+
clipOverlay?: boolean | null | undefined;
|
|
14
|
+
};
|
|
15
|
+
/** Adds a single widget as an overlay on top of an {@link Overlay}'s main child. */
|
|
16
|
+
export type OverlayChildProps<C extends ElementType> = ChildProps<C, OverlayPlacementProps>;
|
|
17
|
+
/**
|
|
18
|
+
* Renders a Gtk.Overlay: a main child with one or more widgets stacked on top,
|
|
19
|
+
* declared via {@link Overlay.Child}. Non-Child children form the main content.
|
|
20
|
+
*/
|
|
21
|
+
export declare const Overlay: ((props: OverlayProps) => ReactNode) & {
|
|
22
|
+
Child: <C extends ElementType>(props: OverlayChildProps<C>) => ReactNode;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAY,KAAK,WAAW,EAAkB,KAAK,SAAS,EAAE,KAAK,GAAG,EAAU,MAAM,OAAO,CAAC;AAErG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,iCAAiC;AACjC,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG;IAChC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;CAC5C,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,IAAI,UAAU,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;AA0C5F;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG;IACzD,KAAK,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;CAkB5E,CAAC"}
|
package/dist/overlay.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { GtkOverlay } from "@gtkx/jsx/gtk";
|
|
3
|
+
import { useMergeRefs } from "@gtkx/react/internal";
|
|
4
|
+
import { Children, isValidElement, useRef } from "react";
|
|
5
|
+
import { createParentContext, usePlacedChild } from "./hooks/use-placed-child.js";
|
|
6
|
+
const { Context: OverlayContext, useParentRef: useOverlayRef } = createParentContext("<Overlay.Child> must be a child of <Overlay>");
|
|
7
|
+
const placementOf = (props) => ({
|
|
8
|
+
measure: props.measure ?? false,
|
|
9
|
+
clipOverlay: props.clipOverlay ?? false,
|
|
10
|
+
});
|
|
11
|
+
const samePlacement = (a, b) => a.measure === b.measure && a.clipOverlay === b.clipOverlay;
|
|
12
|
+
const OverlayChild = ({ component, measure, clipOverlay, ref, ...rest }) => {
|
|
13
|
+
const overlayRef = useOverlayRef();
|
|
14
|
+
const Component = component;
|
|
15
|
+
return usePlacedChild({
|
|
16
|
+
render: (placeRef) => _jsx(Component, { ...rest, ref: placeRef }),
|
|
17
|
+
ref,
|
|
18
|
+
placement: placementOf({ measure, clipOverlay }),
|
|
19
|
+
samePlacement,
|
|
20
|
+
place: (widget, placement) => {
|
|
21
|
+
const overlay = overlayRef.current;
|
|
22
|
+
if (!overlay)
|
|
23
|
+
return;
|
|
24
|
+
if (widget.getParent() !== overlay)
|
|
25
|
+
overlay.addOverlay(widget);
|
|
26
|
+
overlay.setMeasureOverlay(widget, placement.measure);
|
|
27
|
+
overlay.setClipOverlay(widget, placement.clipOverlay);
|
|
28
|
+
},
|
|
29
|
+
release: (widget) => {
|
|
30
|
+
const overlay = overlayRef.current;
|
|
31
|
+
if (overlay && widget.getParent() === overlay)
|
|
32
|
+
overlay.removeOverlay(widget);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const isOverlayChild = (node) => isValidElement(node) && node.type === OverlayChild;
|
|
37
|
+
/**
|
|
38
|
+
* Renders a Gtk.Overlay: a main child with one or more widgets stacked on top,
|
|
39
|
+
* declared via {@link Overlay.Child}. Non-Child children form the main content.
|
|
40
|
+
*/
|
|
41
|
+
export const Overlay = Object.assign(({ children, ref, ...rest }) => {
|
|
42
|
+
const overlayRef = useRef(null);
|
|
43
|
+
const mergedRef = useMergeRefs(ref, overlayRef);
|
|
44
|
+
const items = Children.toArray(children);
|
|
45
|
+
const overlays = items.filter(isOverlayChild);
|
|
46
|
+
const base = items.filter((node) => !isOverlayChild(node));
|
|
47
|
+
return (_jsxs(_Fragment, { children: [_jsx(GtkOverlay, { ...rest, ref: mergedRef, children: base }), _jsx(OverlayContext.Provider, { value: overlayRef, children: overlays })] }));
|
|
48
|
+
}, { Child: OverlayChild });
|
|
49
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { GtkOverlay, type GtkOverlayProps } from \"@gtkx/jsx/gtk\";\nimport { useMergeRefs } from \"@gtkx/react/internal\";\nimport { Children, type ElementType, isValidElement, type ReactNode, type Ref, useRef } from \"react\";\nimport { createParentContext, usePlacedChild } from \"./hooks/use-placed-child.js\";\nimport type { ChildProps } from \"./types.js\";\n\nconst { Context: OverlayContext, useParentRef: useOverlayRef } = createParentContext<Gtk.Overlay>(\n \"<Overlay.Child> must be a child of <Overlay>\",\n);\n\n/** Props for {@link Overlay}. */\nexport type OverlayProps = GtkOverlayProps & { ref?: Ref<Gtk.Overlay | null> };\n\nexport type OverlayPlacementProps = {\n /** Whether this overlay contributes to the Overlay's measured size. */\n measure?: boolean | null | undefined;\n /** Whether the overlay is clipped to the main child's allocation. */\n clipOverlay?: boolean | null | undefined;\n};\n\n/** Adds a single widget as an overlay on top of an {@link Overlay}'s main child. */\nexport type OverlayChildProps<C extends ElementType> = ChildProps<C, OverlayPlacementProps>;\n\ntype OverlayPlacement = { measure: boolean; clipOverlay: boolean };\n\nconst placementOf = (props: OverlayPlacementProps): OverlayPlacement => ({\n measure: props.measure ?? false,\n clipOverlay: props.clipOverlay ?? false,\n});\n\nconst samePlacement = (a: OverlayPlacement, b: OverlayPlacement): boolean =>\n a.measure === b.measure && a.clipOverlay === b.clipOverlay;\n\nconst OverlayChild = <C extends ElementType>({\n component,\n measure,\n clipOverlay,\n ref,\n ...rest\n}: OverlayChildProps<C>): ReactNode => {\n const overlayRef = useOverlayRef();\n const Component: ElementType = component;\n return usePlacedChild<Gtk.Widget, OverlayPlacement>({\n render: (placeRef) => <Component {...rest} ref={placeRef} />,\n ref,\n placement: placementOf({ measure, clipOverlay }),\n samePlacement,\n place: (widget, placement) => {\n const overlay = overlayRef.current;\n if (!overlay) return;\n if (widget.getParent() !== overlay) overlay.addOverlay(widget);\n overlay.setMeasureOverlay(widget, placement.measure);\n overlay.setClipOverlay(widget, placement.clipOverlay);\n },\n release: (widget) => {\n const overlay = overlayRef.current;\n if (overlay && widget.getParent() === overlay) overlay.removeOverlay(widget);\n },\n });\n};\n\nconst isOverlayChild = (node: ReactNode): boolean => isValidElement(node) && node.type === OverlayChild;\n\n/**\n * Renders a Gtk.Overlay: a main child with one or more widgets stacked on top,\n * declared via {@link Overlay.Child}. Non-Child children form the main content.\n */\nexport const Overlay: ((props: OverlayProps) => ReactNode) & {\n Child: <C extends ElementType>(props: OverlayChildProps<C>) => ReactNode;\n} = Object.assign(\n ({ children, ref, ...rest }: OverlayProps): ReactNode => {\n const overlayRef = useRef<Gtk.Overlay | null>(null);\n const mergedRef = useMergeRefs<Gtk.Overlay>(ref, overlayRef);\n const items = Children.toArray(children);\n const overlays = items.filter(isOverlayChild);\n const base = items.filter((node) => !isOverlayChild(node));\n return (\n <>\n <GtkOverlay {...rest} ref={mergedRef}>\n {base}\n </GtkOverlay>\n <OverlayContext.Provider value={overlayRef}>{overlays}</OverlayContext.Provider>\n </>\n );\n },\n { Child: OverlayChild },\n);\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { type ElementType, type ReactNode, type Ref } from "react";
|
|
3
|
+
import type { ChildProps } from "./types.js";
|
|
4
|
+
/** Props for {@link SizeGroup}. */
|
|
5
|
+
export type SizeGroupProps = {
|
|
6
|
+
/** How the group equalizes sizes: horizontal, vertical, or both. */
|
|
7
|
+
mode?: Gtk.SizeGroupMode | null | undefined;
|
|
8
|
+
ref?: Ref<Gtk.SizeGroup | null>;
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
/** Adds a single widget, rendered by the given component, to the enclosing {@link SizeGroup}. */
|
|
12
|
+
export type SizeGroupChildProps<C extends ElementType> = ChildProps<C>;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a Gtk.SizeGroup that keeps its member widgets at a common size. Members join the group
|
|
15
|
+
* through {@link SizeGroup.Child}.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SizeGroup: ((props: SizeGroupProps) => ReactNode) & {
|
|
18
|
+
Child: <C extends ElementType>(props: SizeGroupChildProps<C>) => ReactNode;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=size-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-group.d.ts","sourceRoot":"","sources":["../src/size-group.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAGzC,OAAO,EAEH,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,GAAG,EAKX,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgB7C,mCAAmC;AACnC,MAAM,MAAM,cAAc,GAAG;IACzB,oEAAoE;IACpE,IAAI,CAAC,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAoCvE;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,SAAS,CAAC,GAAG;IAC7D,KAAK,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;CAgB9E,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { GtkSizeGroup } from "@gtkx/jsx/gtk";
|
|
3
|
+
import { useMergeRefs } from "@gtkx/react/internal";
|
|
4
|
+
import { createContext, useCallback, useContext, useRef, } from "react";
|
|
5
|
+
const SizeGroupContext = createContext(null);
|
|
6
|
+
const useSizeGroupRegistry = () => {
|
|
7
|
+
const registry = useContext(SizeGroupContext);
|
|
8
|
+
if (!registry)
|
|
9
|
+
throw new Error("<SizeGroup.Child> must be a child of <SizeGroup>");
|
|
10
|
+
return registry;
|
|
11
|
+
};
|
|
12
|
+
const SizeGroupChild = ({ component, ref, ...rest }) => {
|
|
13
|
+
const registry = useSizeGroupRegistry();
|
|
14
|
+
const joinGroup = useCallback((widget) => {
|
|
15
|
+
if (widget === null)
|
|
16
|
+
return;
|
|
17
|
+
registry.addWidget(widget);
|
|
18
|
+
return () => registry.removeWidget(widget);
|
|
19
|
+
}, [registry]);
|
|
20
|
+
const Component = component;
|
|
21
|
+
const setWidget = useMergeRefs(ref, joinGroup);
|
|
22
|
+
return _jsx(Component, { ...rest, ref: setWidget });
|
|
23
|
+
};
|
|
24
|
+
const createRegistry = () => {
|
|
25
|
+
const members = new Set();
|
|
26
|
+
let group = null;
|
|
27
|
+
return {
|
|
28
|
+
addWidget: (widget) => {
|
|
29
|
+
members.add(widget);
|
|
30
|
+
group?.addWidget(widget);
|
|
31
|
+
},
|
|
32
|
+
removeWidget: (widget) => {
|
|
33
|
+
members.delete(widget);
|
|
34
|
+
group?.removeWidget(widget);
|
|
35
|
+
},
|
|
36
|
+
setGroup: (next) => {
|
|
37
|
+
group = next;
|
|
38
|
+
if (next)
|
|
39
|
+
for (const member of members)
|
|
40
|
+
next.addWidget(member);
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Creates a Gtk.SizeGroup that keeps its member widgets at a common size. Members join the group
|
|
46
|
+
* through {@link SizeGroup.Child}.
|
|
47
|
+
*/
|
|
48
|
+
export const SizeGroup = Object.assign(({ mode, ref, children }) => {
|
|
49
|
+
const registryRef = useRef(null);
|
|
50
|
+
if (registryRef.current === null)
|
|
51
|
+
registryRef.current = createRegistry();
|
|
52
|
+
const registry = registryRef.current;
|
|
53
|
+
const setGroup = useCallback((group) => registry.setGroup(group), [registry]);
|
|
54
|
+
const mergedRef = useMergeRefs(ref, setGroup);
|
|
55
|
+
return (_jsxs(_Fragment, { children: [_jsx(GtkSizeGroup, { ref: mergedRef, mode: mode }), _jsx(SizeGroupContext.Provider, { value: registry, children: children })] }));
|
|
56
|
+
}, { Child: SizeGroupChild });
|
|
57
|
+
//# sourceMappingURL=size-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-group.js","sourceRoot":"","sources":["../src/size-group.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { GtkSizeGroup } from \"@gtkx/jsx/gtk\";\nimport { useMergeRefs } from \"@gtkx/react/internal\";\nimport {\n createContext,\n type ElementType,\n type ReactNode,\n type Ref,\n type RefCallback,\n useCallback,\n useContext,\n useRef,\n} from \"react\";\nimport type { ChildProps } from \"./types.js\";\n\ntype SizeGroupRegistry = {\n addWidget: (widget: Gtk.Widget) => void;\n removeWidget: (widget: Gtk.Widget) => void;\n setGroup: (group: Gtk.SizeGroup | null) => void;\n};\n\nconst SizeGroupContext = createContext<SizeGroupRegistry | null>(null);\n\nconst useSizeGroupRegistry = (): SizeGroupRegistry => {\n const registry = useContext(SizeGroupContext);\n if (!registry) throw new Error(\"<SizeGroup.Child> must be a child of <SizeGroup>\");\n return registry;\n};\n\n/** Props for {@link SizeGroup}. */\nexport type SizeGroupProps = {\n /** How the group equalizes sizes: horizontal, vertical, or both. */\n mode?: Gtk.SizeGroupMode | null | undefined;\n ref?: Ref<Gtk.SizeGroup | null>;\n children?: ReactNode;\n};\n\n/** Adds a single widget, rendered by the given component, to the enclosing {@link SizeGroup}. */\nexport type SizeGroupChildProps<C extends ElementType> = ChildProps<C>;\n\nconst SizeGroupChild = <C extends ElementType>({ component, ref, ...rest }: SizeGroupChildProps<C>): ReactNode => {\n const registry = useSizeGroupRegistry();\n const joinGroup = useCallback<RefCallback<Gtk.Widget>>(\n (widget) => {\n if (widget === null) return;\n registry.addWidget(widget);\n return () => registry.removeWidget(widget);\n },\n [registry],\n );\n const Component: ElementType = component;\n const setWidget = useMergeRefs<Gtk.Widget>(ref, joinGroup);\n return <Component {...rest} ref={setWidget} />;\n};\n\nconst createRegistry = (): SizeGroupRegistry => {\n const members = new Set<Gtk.Widget>();\n let group: Gtk.SizeGroup | null = null;\n return {\n addWidget: (widget) => {\n members.add(widget);\n group?.addWidget(widget);\n },\n removeWidget: (widget) => {\n members.delete(widget);\n group?.removeWidget(widget);\n },\n setGroup: (next) => {\n group = next;\n if (next) for (const member of members) next.addWidget(member);\n },\n };\n};\n\n/**\n * Creates a Gtk.SizeGroup that keeps its member widgets at a common size. Members join the group\n * through {@link SizeGroup.Child}.\n */\nexport const SizeGroup: ((props: SizeGroupProps) => ReactNode) & {\n Child: <C extends ElementType>(props: SizeGroupChildProps<C>) => ReactNode;\n} = Object.assign(\n ({ mode, ref, children }: SizeGroupProps): ReactNode => {\n const registryRef = useRef<SizeGroupRegistry | null>(null);\n if (registryRef.current === null) registryRef.current = createRegistry();\n const registry = registryRef.current;\n const setGroup = useCallback<RefCallback<Gtk.SizeGroup>>((group) => registry.setGroup(group), [registry]);\n const mergedRef = useMergeRefs<Gtk.SizeGroup>(ref, setGroup);\n return (\n <>\n <GtkSizeGroup ref={mergedRef} mode={mode} />\n <SizeGroupContext.Provider value={registry}>{children}</SizeGroupContext.Provider>\n </>\n );\n },\n { Child: SizeGroupChild },\n);\n"]}
|