@gtkx/components 0.21.0 → 1.0.0-rc.2

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 (192) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +173 -0
  3. package/dist/adw/index.d.ts +3 -0
  4. package/dist/adw/index.d.ts.map +1 -0
  5. package/dist/adw/index.js +2 -0
  6. package/dist/adw/index.js.map +1 -0
  7. package/dist/adw/toast.d.ts +10 -0
  8. package/dist/adw/toast.d.ts.map +1 -0
  9. package/dist/adw/toast.js +51 -0
  10. package/dist/adw/toast.js.map +1 -0
  11. package/dist/adw/types.d.ts +28 -0
  12. package/dist/adw/types.d.ts.map +1 -0
  13. package/dist/adw/types.js +2 -0
  14. package/dist/adw/types.js.map +1 -0
  15. package/dist/column-view.d.ts +6 -14
  16. package/dist/column-view.d.ts.map +1 -1
  17. package/dist/column-view.js +98 -100
  18. package/dist/column-view.js.map +1 -1
  19. package/dist/drop-down.d.ts +8 -37
  20. package/dist/drop-down.d.ts.map +1 -1
  21. package/dist/drop-down.js +109 -118
  22. package/dist/drop-down.js.map +1 -1
  23. package/dist/grid-view.d.ts +4 -11
  24. package/dist/grid-view.d.ts.map +1 -1
  25. package/dist/grid-view.js +25 -19
  26. package/dist/grid-view.js.map +1 -1
  27. package/dist/index.d.ts +6 -18
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -14
  30. package/dist/index.js.map +1 -1
  31. package/dist/internal/cells.d.ts +50 -0
  32. package/dist/internal/cells.d.ts.map +1 -0
  33. package/dist/internal/cells.js +185 -0
  34. package/dist/internal/cells.js.map +1 -0
  35. package/dist/internal/collection-index.d.ts +21 -0
  36. package/dist/internal/collection-index.d.ts.map +1 -0
  37. package/dist/internal/collection-index.js +106 -0
  38. package/dist/internal/collection-index.js.map +1 -0
  39. package/dist/internal/collection-model.d.ts +12 -0
  40. package/dist/internal/collection-model.d.ts.map +1 -0
  41. package/dist/internal/collection-model.js +164 -0
  42. package/dist/internal/collection-model.js.map +1 -0
  43. package/dist/internal/collection.d.ts +18 -0
  44. package/dist/internal/collection.d.ts.map +1 -0
  45. package/dist/internal/collection.js +64 -0
  46. package/dist/internal/collection.js.map +1 -0
  47. package/dist/internal/expansion.d.ts +9 -0
  48. package/dist/internal/expansion.d.ts.map +1 -0
  49. package/dist/internal/expansion.js +75 -0
  50. package/dist/internal/expansion.js.map +1 -0
  51. package/dist/internal/selection.d.ts +12 -0
  52. package/dist/internal/selection.d.ts.map +1 -0
  53. package/dist/internal/selection.js +99 -0
  54. package/dist/internal/selection.js.map +1 -0
  55. package/dist/internal/use-collection.d.ts +18 -0
  56. package/dist/internal/use-collection.d.ts.map +1 -0
  57. package/dist/internal/use-collection.js +42 -0
  58. package/dist/internal/use-collection.js.map +1 -0
  59. package/dist/internal/use-widget-ref.d.ts +4 -0
  60. package/dist/internal/use-widget-ref.d.ts.map +1 -0
  61. package/dist/internal/use-widget-ref.js +8 -0
  62. package/dist/internal/use-widget-ref.js.map +1 -0
  63. package/dist/list-view.d.ts +4 -11
  64. package/dist/list-view.d.ts.map +1 -1
  65. package/dist/list-view.js +32 -28
  66. package/dist/list-view.js.map +1 -1
  67. package/dist/size-group.d.ts +12 -0
  68. package/dist/size-group.d.ts.map +1 -0
  69. package/dist/size-group.js +41 -0
  70. package/dist/size-group.js.map +1 -0
  71. package/dist/types.d.ts +104 -161
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js.map +1 -1
  74. package/package.json +62 -52
  75. package/src/adw/index.ts +2 -0
  76. package/src/adw/toast.tsx +74 -0
  77. package/src/adw/types.ts +32 -0
  78. package/src/column-view.tsx +184 -184
  79. package/src/drop-down.tsx +173 -227
  80. package/src/grid-view.tsx +29 -65
  81. package/src/index.ts +16 -25
  82. package/src/internal/cells.tsx +345 -0
  83. package/src/internal/collection-index.ts +168 -0
  84. package/src/internal/collection-model.ts +246 -0
  85. package/src/internal/collection.ts +104 -0
  86. package/src/internal/expansion.ts +123 -0
  87. package/src/internal/selection.tsx +159 -0
  88. package/src/internal/use-collection.tsx +70 -0
  89. package/src/internal/use-widget-ref.ts +11 -0
  90. package/src/list-view.tsx +45 -78
  91. package/src/size-group.tsx +77 -0
  92. package/src/types.ts +171 -191
  93. package/dist/collection-view.d.ts +0 -30
  94. package/dist/collection-view.d.ts.map +0 -1
  95. package/dist/collection-view.js +0 -52
  96. package/dist/collection-view.js.map +0 -1
  97. package/dist/column-view-column.d.ts +0 -17
  98. package/dist/column-view-column.d.ts.map +0 -1
  99. package/dist/column-view-column.js +0 -51
  100. package/dist/column-view-column.js.map +0 -1
  101. package/dist/constraint-layout-apply.d.ts +0 -6
  102. package/dist/constraint-layout-apply.d.ts.map +0 -1
  103. package/dist/constraint-layout-apply.js +0 -107
  104. package/dist/constraint-layout-apply.js.map +0 -1
  105. package/dist/constraint-layout.d.ts +0 -13
  106. package/dist/constraint-layout.d.ts.map +0 -1
  107. package/dist/constraint-layout.js +0 -85
  108. package/dist/constraint-layout.js.map +0 -1
  109. package/dist/contexts/column-view-context.d.ts +0 -17
  110. package/dist/contexts/column-view-context.d.ts.map +0 -1
  111. package/dist/contexts/column-view-context.js +0 -10
  112. package/dist/contexts/column-view-context.js.map +0 -1
  113. package/dist/hooks/use-drop-down-selection.d.ts +0 -15
  114. package/dist/hooks/use-drop-down-selection.d.ts.map +0 -1
  115. package/dist/hooks/use-drop-down-selection.js +0 -35
  116. package/dist/hooks/use-drop-down-selection.js.map +0 -1
  117. package/dist/hooks/use-header-menu.d.ts +0 -4
  118. package/dist/hooks/use-header-menu.d.ts.map +0 -1
  119. package/dist/hooks/use-header-menu.js +0 -32
  120. package/dist/hooks/use-header-menu.js.map +0 -1
  121. package/dist/hooks/use-list-model.d.ts +0 -20
  122. package/dist/hooks/use-list-model.d.ts.map +0 -1
  123. package/dist/hooks/use-list-model.js +0 -70
  124. package/dist/hooks/use-list-model.js.map +0 -1
  125. package/dist/hooks/use-model-installation.d.ts +0 -9
  126. package/dist/hooks/use-model-installation.d.ts.map +0 -1
  127. package/dist/hooks/use-model-installation.js +0 -20
  128. package/dist/hooks/use-model-installation.js.map +0 -1
  129. package/dist/hooks/use-realized-slots.d.ts +0 -20
  130. package/dist/hooks/use-realized-slots.d.ts.map +0 -1
  131. package/dist/hooks/use-realized-slots.js +0 -66
  132. package/dist/hooks/use-realized-slots.js.map +0 -1
  133. package/dist/hooks/use-selection-model.d.ts +0 -12
  134. package/dist/hooks/use-selection-model.d.ts.map +0 -1
  135. package/dist/hooks/use-selection-model.js +0 -111
  136. package/dist/hooks/use-selection-model.js.map +0 -1
  137. package/dist/hooks/use-sort-handler.d.ts +0 -12
  138. package/dist/hooks/use-sort-handler.d.ts.map +0 -1
  139. package/dist/hooks/use-sort-handler.js +0 -87
  140. package/dist/hooks/use-sort-handler.js.map +0 -1
  141. package/dist/list-portal-host.d.ts +0 -11
  142. package/dist/list-portal-host.d.ts.map +0 -1
  143. package/dist/list-portal-host.js +0 -8
  144. package/dist/list-portal-host.js.map +0 -1
  145. package/dist/list-slot.d.ts +0 -14
  146. package/dist/list-slot.d.ts.map +0 -1
  147. package/dist/list-slot.js +0 -29
  148. package/dist/list-slot.js.map +0 -1
  149. package/dist/menu-items.d.ts +0 -5
  150. package/dist/menu-items.d.ts.map +0 -1
  151. package/dist/menu-items.js +0 -48
  152. package/dist/menu-items.js.map +0 -1
  153. package/dist/menu.d.ts +0 -18
  154. package/dist/menu.d.ts.map +0 -1
  155. package/dist/menu.js +0 -26
  156. package/dist/menu.js.map +0 -1
  157. package/dist/utils/item-resolver.d.ts +0 -28
  158. package/dist/utils/item-resolver.d.ts.map +0 -1
  159. package/dist/utils/item-resolver.js +0 -111
  160. package/dist/utils/item-resolver.js.map +0 -1
  161. package/dist/utils/list-item-flatten.d.ts +0 -32
  162. package/dist/utils/list-item-flatten.d.ts.map +0 -1
  163. package/dist/utils/list-item-flatten.js +0 -88
  164. package/dist/utils/list-item-flatten.js.map +0 -1
  165. package/dist/utils/position-only-model.d.ts +0 -10
  166. package/dist/utils/position-only-model.d.ts.map +0 -1
  167. package/dist/utils/position-only-model.js +0 -83
  168. package/dist/utils/position-only-model.js.map +0 -1
  169. package/dist/utils/realized-slot-store.d.ts +0 -30
  170. package/dist/utils/realized-slot-store.d.ts.map +0 -1
  171. package/dist/utils/realized-slot-store.js +0 -103
  172. package/dist/utils/realized-slot-store.js.map +0 -1
  173. package/src/collection-view.tsx +0 -125
  174. package/src/column-view-column.tsx +0 -73
  175. package/src/constraint-layout-apply.ts +0 -121
  176. package/src/constraint-layout.tsx +0 -130
  177. package/src/contexts/column-view-context.ts +0 -28
  178. package/src/hooks/use-drop-down-selection.ts +0 -53
  179. package/src/hooks/use-header-menu.ts +0 -33
  180. package/src/hooks/use-list-model.ts +0 -145
  181. package/src/hooks/use-model-installation.ts +0 -25
  182. package/src/hooks/use-realized-slots.ts +0 -93
  183. package/src/hooks/use-selection-model.ts +0 -121
  184. package/src/hooks/use-sort-handler.ts +0 -102
  185. package/src/list-portal-host.tsx +0 -27
  186. package/src/list-slot.tsx +0 -56
  187. package/src/menu-items.ts +0 -48
  188. package/src/menu.tsx +0 -34
  189. package/src/utils/item-resolver.ts +0 -143
  190. package/src/utils/list-item-flatten.ts +0 -113
  191. package/src/utils/position-only-model.ts +0 -115
  192. package/src/utils/realized-slot-store.ts +0 -126
@@ -1 +1 @@
1
- {"version":3,"file":"drop-down.js","sourceRoot":"","sources":["../src/drop-down.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drop-down.js","sourceRoot":"","sources":["../src/drop-down.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport type { ElementType, ReactNode, Ref, RefObject } from \"react\";\nimport { GtkDropDown, GtkLabel, GtkSignalListItemFactory } from \"@gtkx/jsx/gtk\";\nimport { useSignal } from \"@gtkx/react\";\nimport { omit } from \"@gtkx/utils\";\nimport { useEffectEvent, useLayoutEffect, useRef } from \"react\";\nimport type { Collection } from \"./internal/collection.js\";\nimport type { DropDownProps, ItemRenderer, RenderItemArgs } from \"./types.js\";\nimport { HeaderPortals, ItemPortals, useHeaderCells, useItemCells } from \"./internal/cells.js\";\nimport { useCollectionData } from \"./internal/use-collection.js\";\nimport { useWidgetRef } from \"./internal/use-widget-ref.js\";\n\ntype SelectableWidget = GObject.Object & { getSelected: () => number; selected: number };\n\ntype DropDownRuntimeProps = DropDownProps & {\n component?: ElementType | undefined;\n ref?: Ref<SelectableWidget | null> | undefined;\n} & Record<string, unknown>;\n\ntype SelectionOptions = {\n widget: SelectableWidget | null;\n collection: Collection;\n applying: RefObject<boolean>;\n props: DropDownRuntimeProps;\n};\n\ntype KnownSelection = {\n known: { current: string | null };\n onSelectionChanged: ((id: string) => void) | null | undefined;\n};\n\ntype DropDownComponent = <T = unknown, S = unknown, C extends ElementType = typeof GtkDropDown>(\n props: DropDownProps<T, S, C>,\n) => ReactNode;\n\nconst DROP_DOWN_PROPS: string[] = [\n \"component\",\n \"items\",\n \"sections\",\n \"selectedId\",\n \"onSelectionChanged\",\n \"renderItem\",\n \"renderListItem\",\n \"renderHeader\",\n \"ref\",\n];\n\n/**\n * Renders a drop-down backed by a collection model, with customizable renderers for the\n * collapsed display, popup rows, and popup section headers, and controlled selection.\n * The backing widget defaults to GtkDropDown and is swappable through `component`.\n */\nconst DropDown: DropDownComponent = DropDownImpl as DropDownComponent;\n\nconst describeValue = (value: unknown): string => {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst defaultItemContent = (value: unknown): ReactNode =>\n value == null ? null : <GtkLabel>{describeValue(value)}</GtkLabel>;\n\nconst defaultRenderItem = ({ item }: RenderItemArgs<unknown>): ReactNode => defaultItemContent(item);\n\nconst faceRenderer = (props: DropDownRuntimeProps): ItemRenderer<never> =>\n props.renderItem ?? defaultRenderItem;\n\nconst listRenderer = (props: DropDownRuntimeProps): ItemRenderer<never> =>\n props.renderListItem ?? props.renderItem ?? defaultRenderItem;\n\nconst resolvePosition = (\n widget: SelectableWidget,\n collection: Collection,\n selectedId: string | null | undefined,\n): number => {\n const requested = selectedId == null ? -1 : collection.positionFor(selectedId);\n\n return requested >= 0 ? requested : widget.getSelected();\n};\n\nconst updateKnownSelection = (\n tracker: KnownSelection,\n effectiveId: string,\n selectedId: string | null | undefined,\n): void => {\n const { known, onSelectionChanged } = tracker;\n const expectedId = selectedId ?? known.current;\n const isNew = effectiveId !== known.current;\n known.current = effectiveId;\n\n if (expectedId !== null && effectiveId !== expectedId && isNew) {\n onSelectionChanged?.(effectiveId);\n }\n};\n\nconst reportKnownSelection = (tracker: KnownSelection, id: string | null): void => {\n const { known, onSelectionChanged } = tracker;\n\n if (id === null || id === known.current) {\n return;\n }\n\n known.current = id;\n onSelectionChanged?.(id);\n};\n\nconst reportSelectedNotify = (\n options: SelectionOptions,\n tracker: KnownSelection,\n applying: RefObject<boolean>,\n): void => {\n const { widget, collection } = options;\n\n if (widget === null || applying.current) {\n return;\n }\n\n reportKnownSelection(tracker, collection.idAt(widget.getSelected()));\n};\n\nconst applySelectedPosition = (widget: SelectableWidget, position: number, applying: RefObject<boolean>): void => {\n applying.current = true;\n\n try {\n widget.selected = position;\n } finally {\n applying.current = false;\n }\n};\n\nconst useDropDownSelection = (options: SelectionOptions): void => {\n const { widget, collection, applying } = options;\n const { selectedId } = options.props;\n const known = useRef<string | null>(null);\n\n const syncKnownSelection = useEffectEvent((position: number): void => {\n const effectiveId = collection.idAt(position);\n\n if (effectiveId === null) {\n known.current = null;\n\n return;\n }\n\n const { onSelectionChanged } = options.props;\n updateKnownSelection({ known, onSelectionChanged }, effectiveId, selectedId);\n });\n\n useLayoutEffect(() => {\n if (widget === null) {\n return;\n }\n\n const position = resolvePosition(widget, collection, selectedId);\n applySelectedPosition(widget, position, applying);\n syncKnownSelection(position);\n }, [widget, collection, selectedId, applying]);\n\n useSignal(widget, \"notify::selected\", (): void => {\n reportSelectedNotify(options, { known, onSelectionChanged: options.props.onSelectionChanged }, applying);\n });\n};\n\nfunction DropDownImpl(props: DropDownRuntimeProps): ReactNode {\n const { component, items, sections, renderListItem, renderHeader, ref } = props;\n const rest = omit(props, DROP_DOWN_PROPS);\n const [widget, refCallback] = useWidgetRef<SelectableWidget>(ref);\n const applying = useRef(false);\n const collection = useCollectionData({ items, sections, applying });\n const faceCells = useItemCells({ width: -1, height: -1 });\n const listCells = useItemCells({ width: -1, height: -1 });\n const headerCells = useHeaderCells({ width: -1, height: -1 });\n useDropDownSelection({ widget, collection, applying, props });\n const Component = component ?? GtkDropDown;\n const hasHeader = typeof renderHeader === \"function\";\n\n return (\n <>\n <Component\n ref={refCallback}\n model={collection.model}\n factory={<GtkSignalListItemFactory {...faceCells.handlers} />}\n {...(renderListItem != null && {\n listFactory: <GtkSignalListItemFactory {...listCells.handlers} />,\n })}\n {...(hasHeader && { headerFactory: <GtkSignalListItemFactory {...headerCells.handlers} /> })}\n {...rest}\n />\n <ItemPortals store={faceCells} render={faceRenderer(props)} collection={collection} />\n {renderListItem != null && (\n <ItemPortals store={listCells} render={listRenderer(props)} collection={collection} />\n )}\n {hasHeader && <HeaderPortals store={headerCells} render={renderHeader} collection={collection} />}\n </>\n );\n}\n\nexport { DropDown };\n"]}
@@ -1,16 +1,9 @@
1
- import { type GtkGridViewProps } from "@gtkx/jsx/gtk";
2
1
  import type { ReactNode } from "react";
3
2
  import type { GridViewProps } from "./types.js";
4
3
  /**
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.
4
+ * Renders a Gtk.GridView of uniform cells from declarative items, with per-cell
5
+ * rendering, controlled selection, and estimated item sizing.
8
6
  */
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;
7
+ declare function GridView<T = unknown>(props: GridViewProps<T>): ReactNode;
8
+ export { GridView };
16
9
  //# sourceMappingURL=grid-view.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"grid-view.d.ts","sourceRoot":"","sources":["../src/grid-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAchD;;;GAGG;AACH,iBAAS,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAajE;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
package/dist/grid-view.js CHANGED
@@ -1,22 +1,28 @@
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
- };
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { GtkGridView, GtkSignalListItemFactory } from "@gtkx/jsx/gtk";
3
+ import { omit } from "@gtkx/utils";
4
+ import { ItemPortals, useItemCells } from "./internal/cells.js";
5
+ import { useCollection } from "./internal/use-collection.js";
6
+ const GRID_VIEW_PROPS = [
7
+ "items",
8
+ "renderItem",
9
+ "selectedIds",
10
+ "onSelectionChanged",
11
+ "selectionMode",
12
+ "estimatedItemHeight",
13
+ "estimatedItemWidth",
14
+ ];
11
15
  /**
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.
16
+ * Renders a Gtk.GridView of uniform cells from declarative items, with per-cell
17
+ * rendering, controlled selection, and estimated item sizing.
15
18
  */
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
- };
19
+ function GridView(props) {
20
+ const { renderItem, estimatedItemHeight, estimatedItemWidth } = props;
21
+ const rest = omit(props, GRID_VIEW_PROPS);
22
+ const size = { width: estimatedItemWidth ?? -1, height: estimatedItemHeight ?? -1 };
23
+ const { collection, selection } = useCollection({ ...props, flat: true });
24
+ const itemCells = useItemCells(size);
25
+ return (_jsxs(_Fragment, { children: [_jsx(GtkGridView, { model: selection, factory: _jsx(GtkSignalListItemFactory, { ...itemCells.handlers }), ...rest }), _jsx(ItemPortals, { store: itemCells, render: renderItem, collection: collection })] }));
26
+ }
27
+ export { GridView };
22
28
  //# sourceMappingURL=grid-view.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"grid-view.js","sourceRoot":"","sources":["../src/grid-view.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,eAAe,GAAG;IACpB,OAAO;IACP,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,eAAe;IACf,qBAAqB;IACrB,oBAAoB;CACoB,CAAC;AAE7C;;;GAGG;AACH,SAAS,QAAQ,CAAc,KAAuB;IAClD,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,kBAAkB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,IAAI,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,CACH,8BACI,KAAC,WAAW,IAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAC,wBAAwB,OAAK,SAAS,CAAC,QAAQ,GAAI,KAAM,IAAI,GAAI,EAC1G,KAAC,WAAW,IAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAI,IAC9E,CACN,CAAC;AACN,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport { GtkGridView, GtkSignalListItemFactory } from \"@gtkx/jsx/gtk\";\nimport { omit } from \"@gtkx/utils\";\nimport type { GridViewProps } from \"./types.js\";\nimport { ItemPortals, useItemCells } from \"./internal/cells.js\";\nimport { useCollection } from \"./internal/use-collection.js\";\n\nconst GRID_VIEW_PROPS = [\n \"items\",\n \"renderItem\",\n \"selectedIds\",\n \"onSelectionChanged\",\n \"selectionMode\",\n \"estimatedItemHeight\",\n \"estimatedItemWidth\",\n] as const satisfies (keyof GridViewProps)[];\n\n/**\n * Renders a Gtk.GridView of uniform cells from declarative items, with per-cell\n * rendering, controlled selection, and estimated item sizing.\n */\nfunction GridView<T = unknown>(props: GridViewProps<T>): ReactNode {\n const { renderItem, estimatedItemHeight, estimatedItemWidth } = props;\n const rest = omit(props, GRID_VIEW_PROPS);\n const size = { width: estimatedItemWidth ?? -1, height: estimatedItemHeight ?? -1 };\n const { collection, selection } = useCollection({ ...props, flat: true });\n const itemCells = useItemCells(size);\n\n return (\n <>\n <GtkGridView model={selection} factory={<GtkSignalListItemFactory {...itemCells.handlers} />} {...rest} />\n <ItemPortals store={itemCells} render={renderItem} collection={collection} />\n </>\n );\n}\n\nexport { GridView };\n"]}
package/dist/index.d.ts CHANGED
@@ -1,19 +1,7 @@
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";
1
+ export { ColumnView } from "./column-view.js";
2
+ export { DropDown } from "./drop-down.js";
3
+ export { GridView } from "./grid-view.js";
4
+ export { ListView } from "./list-view.js";
5
+ export { SizeGroup } from "./size-group.js";
6
+ export type { ChildProps, Column, ColumnViewProps, DropDownProps, GridViewProps, HeaderRenderer, Item, ItemRenderer, ListViewProps, RenderHeaderArgs, RenderItemArgs, Section, SizeGroupChildProps, SizeGroupProps, WidgetProps, } from "./types.js";
19
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACR,UAAU,EACV,MAAM,EACN,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,WAAW,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,18 +1,6 @@
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
1
  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";
2
+ export { DropDown } from "./drop-down.js";
15
3
  export { GridView } from "./grid-view.js";
16
4
  export { ListView } from "./list-view.js";
17
- export { Menu } from "./menu.js";
5
+ export { SizeGroup } from "./size-group.js";
18
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export { ColumnView } from \"./column-view.js\";\nexport { DropDown } from \"./drop-down.js\";\nexport { GridView } from \"./grid-view.js\";\nexport { ListView } from \"./list-view.js\";\nexport { SizeGroup } from \"./size-group.js\";\nexport type {\n ChildProps,\n Column,\n ColumnViewProps,\n DropDownProps,\n GridViewProps,\n HeaderRenderer,\n Item,\n ItemRenderer,\n ListViewProps,\n RenderHeaderArgs,\n RenderItemArgs,\n Section,\n SizeGroupChildProps,\n SizeGroupProps,\n WidgetProps,\n} from \"./types.js\";\n"]}
@@ -0,0 +1,50 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import type { ReactNode } from "react";
3
+ import * as Gtk from "@gtkx/gi/gtk";
4
+ import type { HeaderRenderer, ItemRenderer } from "../types.js";
5
+ import type { Collection } from "./collection.js";
6
+ type CellSize = {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ type CellHost = GObject.Object & {
11
+ getChild: () => Gtk.Widget | null;
12
+ setChild: (child: Gtk.Widget | null) => void;
13
+ };
14
+ type CellEntry<C extends CellHost> = {
15
+ key: string;
16
+ cell: C;
17
+ item: GObject.Object | null;
18
+ listeners: Set<() => void>;
19
+ subscribe: (onChange: () => void) => () => void;
20
+ getItem: () => GObject.Object | null;
21
+ };
22
+ type FactoryHandlers = {
23
+ onSetup: (cell: GObject.Object) => void;
24
+ onBind: (cell: GObject.Object) => void;
25
+ onUnbind: (cell: GObject.Object) => void;
26
+ onTeardown: (cell: GObject.Object) => void;
27
+ };
28
+ type CellStore<C extends CellHost> = {
29
+ handlers: FactoryHandlers;
30
+ setSize: (size: CellSize) => void;
31
+ subscribe: (onChange: () => void) => () => void;
32
+ getSnapshot: () => CellEntry<C>[];
33
+ };
34
+ type ItemPortalsProps = {
35
+ store: CellStore<Gtk.ListItem>;
36
+ render: ItemRenderer<never>;
37
+ collection: Collection;
38
+ expandedIds?: string[] | null | undefined;
39
+ };
40
+ type HeaderPortalsProps = {
41
+ store: CellStore<Gtk.ListHeader>;
42
+ render: HeaderRenderer<never>;
43
+ collection: Collection;
44
+ };
45
+ declare function useItemCells(size: CellSize): CellStore<Gtk.ListItem>;
46
+ declare function useHeaderCells(size: CellSize): CellStore<Gtk.ListHeader>;
47
+ declare const ItemPortals: ({ store, render, collection, expandedIds }: ItemPortalsProps) => ReactNode;
48
+ declare const HeaderPortals: ({ store, render, collection }: HeaderPortalsProps) => ReactNode;
49
+ export { useItemCells, useHeaderCells, ItemPortals, HeaderPortals, type CellSize, type CellStore, };
50
+ //# sourceMappingURL=cells.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cells.d.ts","sourceRoot":"","sources":["../../src/internal/cells.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as Gtk from "@gtkx/gi/gtk";
3
+ import { GtkTreeExpander } from "@gtkx/jsx/gtk";
4
+ import { createPortal, useProperty } from "@gtkx/react";
5
+ import { memo, useLayoutEffect, useState, useSyncExternalStore } from "react";
6
+ import { getId } from "./collection-model.js";
7
+ const ItemCell = memo(ItemCellImpl);
8
+ const HeaderCell = memo(HeaderCellImpl);
9
+ const isListItem = (value) => value instanceof Gtk.ListItem;
10
+ const isListHeader = (value) => value instanceof Gtk.ListHeader;
11
+ const placeholder = (size) => new Gtk.Box({ widthRequest: size.width, heightRequest: size.height });
12
+ function notifyEntry(entry) {
13
+ for (const listener of entry.listeners) {
14
+ listener();
15
+ }
16
+ }
17
+ function notifyRoster(state) {
18
+ state.snapshot = null;
19
+ for (const listener of state.listeners) {
20
+ listener();
21
+ }
22
+ }
23
+ function createEntry(state, cell) {
24
+ state.serial += 1;
25
+ const entry = {
26
+ key: `gtkx-cell-${String(state.serial)}`,
27
+ cell,
28
+ item: null,
29
+ listeners: new Set(),
30
+ subscribe: (onChange) => {
31
+ entry.listeners.add(onChange);
32
+ return () => {
33
+ entry.listeners.delete(onChange);
34
+ };
35
+ },
36
+ getItem: () => entry.item,
37
+ };
38
+ return entry;
39
+ }
40
+ function setupCell(state, cell) {
41
+ cell.setChild(placeholder(state.size));
42
+ state.entries.set(cell, createEntry(state, cell));
43
+ notifyRoster(state);
44
+ }
45
+ function teardownCell(state, cell) {
46
+ if (state.entries.delete(cell)) {
47
+ notifyRoster(state);
48
+ }
49
+ }
50
+ function writeBinding(state, cell, item) {
51
+ const entry = state.entries.get(cell);
52
+ if (entry === undefined) {
53
+ return;
54
+ }
55
+ entry.item = item;
56
+ notifyEntry(entry);
57
+ }
58
+ function boundItem(cell) {
59
+ if (cell instanceof Gtk.ListItem) {
60
+ return cell.getItem();
61
+ }
62
+ return cell instanceof Gtk.ListHeader ? cell.getItem() : null;
63
+ }
64
+ function bindCell(state, cell) {
65
+ if (cell.getChild() === null) {
66
+ cell.setChild(placeholder(state.size));
67
+ }
68
+ writeBinding(state, cell, boundItem(cell));
69
+ }
70
+ function subscribeRoster(state, onChange) {
71
+ state.listeners.add(onChange);
72
+ return () => {
73
+ state.listeners.delete(onChange);
74
+ };
75
+ }
76
+ function rosterSnapshot(state) {
77
+ state.snapshot ??= state.entries.values().toArray();
78
+ return state.snapshot;
79
+ }
80
+ function guarded(isCell, run) {
81
+ return (cell) => {
82
+ if (isCell(cell)) {
83
+ run(cell);
84
+ }
85
+ };
86
+ }
87
+ function createHandlers(state, isCell) {
88
+ return {
89
+ onSetup: guarded(isCell, (cell) => {
90
+ setupCell(state, cell);
91
+ }),
92
+ onBind: guarded(isCell, (cell) => {
93
+ bindCell(state, cell);
94
+ }),
95
+ onUnbind: guarded(isCell, (cell) => {
96
+ writeBinding(state, cell, null);
97
+ }),
98
+ onTeardown: guarded(isCell, (cell) => {
99
+ teardownCell(state, cell);
100
+ }),
101
+ };
102
+ }
103
+ function createCellStore(isCell, size) {
104
+ const state = {
105
+ size,
106
+ entries: new Map(),
107
+ snapshot: null,
108
+ listeners: new Set(),
109
+ serial: 0,
110
+ };
111
+ return {
112
+ handlers: createHandlers(state, isCell),
113
+ setSize: (next) => {
114
+ state.size = next;
115
+ },
116
+ subscribe: (onChange) => subscribeRoster(state, onChange),
117
+ getSnapshot: () => rosterSnapshot(state),
118
+ };
119
+ }
120
+ function useCellStore(isCell, size) {
121
+ const [store] = useState(() => createCellStore(isCell, size));
122
+ useLayoutEffect(() => {
123
+ store.setSize(size);
124
+ });
125
+ return store;
126
+ }
127
+ function useItemCells(size) {
128
+ return useCellStore(isListItem, size);
129
+ }
130
+ function useHeaderCells(size) {
131
+ return useCellStore(isListHeader, size);
132
+ }
133
+ function isRowWanted(options, item) {
134
+ const { expandedIds } = options;
135
+ return expandedIds == null ? options.isRowExpanded === true : expandedIds.includes(item.id);
136
+ }
137
+ function itemArgs(item, options) {
138
+ const args = { item: item.value, index: options.position ?? 0 };
139
+ const row = options.row;
140
+ if (row === null) {
141
+ return args;
142
+ }
143
+ args.depth = row.getDepth();
144
+ if (row.isExpandable()) {
145
+ args.isExpanded = isRowWanted(options, item);
146
+ }
147
+ return args;
148
+ }
149
+ function wrapExpander(item, row, content) {
150
+ const expander = row === null
151
+ ? (content)
152
+ : (_jsx(GtkTreeExpander, { listRow: row, hideExpander: item.hideExpander ?? false, indentForDepth: item.indentForDepth ?? true, indentForIcon: item.indentForIcon ?? true, children: content }));
153
+ return expander;
154
+ }
155
+ function itemBody(options) {
156
+ const id = getId(options.item);
157
+ const item = id === null ? undefined : options.collection.itemFor(id);
158
+ if (item === undefined) {
159
+ return null;
160
+ }
161
+ const render = options.render;
162
+ return wrapExpander(item, options.row, render(itemArgs(item, options)));
163
+ }
164
+ function ItemCellImpl({ entry, render, collection, expandedIds }) {
165
+ const item = useSyncExternalStore(entry.subscribe, entry.getItem);
166
+ const position = useProperty(entry.cell, "position");
167
+ const row = item instanceof Gtk.TreeListRow ? item : null;
168
+ const isRowExpanded = useProperty(row, "expanded");
169
+ const body = itemBody({ item, position, row, isRowExpanded, render, collection, expandedIds });
170
+ return createPortal(body, entry.cell, entry.key);
171
+ }
172
+ function HeaderCellImpl({ entry, render, collection }) {
173
+ const item = useSyncExternalStore(entry.subscribe, entry.getItem);
174
+ const id = getId(item);
175
+ const renderHeader = render;
176
+ const body = id === null ? null : renderHeader({ section: collection.sectionFor(id) });
177
+ return createPortal(body, entry.cell, entry.key);
178
+ }
179
+ function usePortalEntries(store) {
180
+ return useSyncExternalStore(store.subscribe, store.getSnapshot);
181
+ }
182
+ const ItemPortals = ({ store, render, collection, expandedIds }) => usePortalEntries(store).map((entry) => (_jsx(ItemCell, { entry: entry, render: render, collection: collection, expandedIds: expandedIds }, entry.key)));
183
+ const HeaderPortals = ({ store, render, collection }) => usePortalEntries(store).map((entry) => (_jsx(HeaderCell, { entry: entry, render: render, collection: collection }, entry.key)));
184
+ export { useItemCells, useHeaderCells, ItemPortals, HeaderPortals, };
185
+ //# sourceMappingURL=cells.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cells.js","sourceRoot":"","sources":["../../src/internal/cells.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport type { ReactNode } from \"react\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { GtkTreeExpander } from \"@gtkx/jsx/gtk\";\nimport { createPortal, useProperty } from \"@gtkx/react\";\nimport { memo, useLayoutEffect, useState, useSyncExternalStore } from \"react\";\nimport type { HeaderRenderer, Item, ItemRenderer, RenderItemArgs } from \"../types.js\";\nimport type { Collection } from \"./collection.js\";\nimport { getId } from \"./collection-model.js\";\n\ntype CellSize = {\n width: number;\n height: number;\n};\n\ntype CellHost = GObject.Object & {\n getChild: () => Gtk.Widget | null;\n setChild: (child: Gtk.Widget | null) => void;\n};\n\ntype CellEntry<C extends CellHost> = {\n key: string;\n cell: C;\n item: GObject.Object | null;\n listeners: Set<() => void>;\n subscribe: (onChange: () => void) => () => void;\n getItem: () => GObject.Object | null;\n};\n\ntype FactoryHandlers = {\n onSetup: (cell: GObject.Object) => void;\n onBind: (cell: GObject.Object) => void;\n onUnbind: (cell: GObject.Object) => void;\n onTeardown: (cell: GObject.Object) => void;\n};\n\ntype CellStore<C extends CellHost> = {\n handlers: FactoryHandlers;\n setSize: (size: CellSize) => void;\n subscribe: (onChange: () => void) => () => void;\n getSnapshot: () => CellEntry<C>[];\n};\n\ntype StoreState<C extends CellHost> = {\n size: CellSize;\n entries: Map<C, CellEntry<C>>;\n snapshot: CellEntry<C>[] | null;\n listeners: Set<() => void>;\n serial: number;\n};\n\ntype CellGuard<C extends CellHost> = (value: GObject.Object) => value is C;\n\ntype ItemBodyOptions = {\n item: GObject.Object | null;\n position: number | undefined;\n row: Gtk.TreeListRow | null;\n isRowExpanded: boolean | undefined;\n render: ItemRenderer<never>;\n collection: Collection;\n expandedIds: string[] | null | undefined;\n};\n\ntype ItemCellProps = {\n entry: CellEntry<Gtk.ListItem>;\n render: ItemRenderer<never>;\n collection: Collection;\n expandedIds: string[] | null | undefined;\n};\n\ntype ItemPortalsProps = {\n store: CellStore<Gtk.ListItem>;\n render: ItemRenderer<never>;\n collection: Collection;\n expandedIds?: string[] | null | undefined;\n};\n\ntype HeaderCellProps = {\n entry: CellEntry<Gtk.ListHeader>;\n render: HeaderRenderer<never>;\n collection: Collection;\n};\n\ntype HeaderPortalsProps = {\n store: CellStore<Gtk.ListHeader>;\n render: HeaderRenderer<never>;\n collection: Collection;\n};\n\nconst ItemCell = memo(ItemCellImpl);\nconst HeaderCell = memo(HeaderCellImpl);\n\nconst isListItem = (value: GObject.Object): value is Gtk.ListItem => value instanceof Gtk.ListItem;\nconst isListHeader = (value: GObject.Object): value is Gtk.ListHeader => value instanceof Gtk.ListHeader;\n\nconst placeholder = (size: CellSize): Gtk.Widget =>\n new Gtk.Box({ widthRequest: size.width, heightRequest: size.height });\n\nfunction notifyEntry<C extends CellHost>(entry: CellEntry<C>): void {\n for (const listener of entry.listeners) {\n listener();\n }\n}\n\nfunction notifyRoster<C extends CellHost>(state: StoreState<C>): void {\n state.snapshot = null;\n\n for (const listener of state.listeners) {\n listener();\n }\n}\n\nfunction createEntry<C extends CellHost>(state: StoreState<C>, cell: C): CellEntry<C> {\n state.serial += 1;\n\n const entry: CellEntry<C> = {\n key: `gtkx-cell-${String(state.serial)}`,\n cell,\n item: null,\n listeners: new Set(),\n subscribe: (onChange) => {\n entry.listeners.add(onChange);\n\n return () => {\n entry.listeners.delete(onChange);\n };\n },\n getItem: () => entry.item,\n };\n\n return entry;\n}\n\nfunction setupCell<C extends CellHost>(state: StoreState<C>, cell: C): void {\n cell.setChild(placeholder(state.size));\n state.entries.set(cell, createEntry(state, cell));\n notifyRoster(state);\n}\n\nfunction teardownCell<C extends CellHost>(state: StoreState<C>, cell: C): void {\n if (state.entries.delete(cell)) {\n notifyRoster(state);\n }\n}\n\nfunction writeBinding<C extends CellHost>(state: StoreState<C>, cell: C, item: GObject.Object | null): void {\n const entry = state.entries.get(cell);\n\n if (entry === undefined) {\n return;\n }\n\n entry.item = item;\n notifyEntry(entry);\n}\n\nfunction boundItem(cell: CellHost): GObject.Object | null {\n if (cell instanceof Gtk.ListItem) {\n return cell.getItem();\n }\n\n return cell instanceof Gtk.ListHeader ? cell.getItem() : null;\n}\n\nfunction bindCell<C extends CellHost>(state: StoreState<C>, cell: C): void {\n if (cell.getChild() === null) {\n cell.setChild(placeholder(state.size));\n }\n\n writeBinding(state, cell, boundItem(cell));\n}\n\nfunction subscribeRoster<C extends CellHost>(state: StoreState<C>, onChange: () => void): () => void {\n state.listeners.add(onChange);\n\n return () => {\n state.listeners.delete(onChange);\n };\n}\n\nfunction rosterSnapshot<C extends CellHost>(state: StoreState<C>): CellEntry<C>[] {\n state.snapshot ??= state.entries.values().toArray();\n\n return state.snapshot;\n}\n\nfunction guarded<C extends CellHost>(isCell: CellGuard<C>, run: (cell: C) => void): (cell: GObject.Object) => void {\n return (cell) => {\n if (isCell(cell)) {\n run(cell);\n }\n };\n}\n\nfunction createHandlers<C extends CellHost>(state: StoreState<C>, isCell: CellGuard<C>): FactoryHandlers {\n return {\n onSetup: guarded(isCell, (cell) => {\n setupCell(state, cell);\n }),\n onBind: guarded(isCell, (cell) => {\n bindCell(state, cell);\n }),\n onUnbind: guarded(isCell, (cell) => {\n writeBinding(state, cell, null);\n }),\n onTeardown: guarded(isCell, (cell) => {\n teardownCell(state, cell);\n }),\n };\n}\n\nfunction createCellStore<C extends CellHost>(isCell: CellGuard<C>, size: CellSize): CellStore<C> {\n const state: StoreState<C> = {\n size,\n entries: new Map(),\n snapshot: null,\n listeners: new Set(),\n serial: 0,\n };\n\n return {\n handlers: createHandlers(state, isCell),\n setSize: (next) => {\n state.size = next;\n },\n subscribe: (onChange) => subscribeRoster(state, onChange),\n getSnapshot: () => rosterSnapshot(state),\n };\n}\n\nfunction useCellStore<C extends CellHost>(isCell: CellGuard<C>, size: CellSize): CellStore<C> {\n const [store] = useState(() => createCellStore(isCell, size));\n\n useLayoutEffect(() => {\n store.setSize(size);\n });\n\n return store;\n}\n\nfunction useItemCells(size: CellSize): CellStore<Gtk.ListItem> {\n return useCellStore(isListItem, size);\n}\n\nfunction useHeaderCells(size: CellSize): CellStore<Gtk.ListHeader> {\n return useCellStore(isListHeader, size);\n}\n\nfunction isRowWanted(options: ItemBodyOptions, item: Item): boolean {\n const { expandedIds } = options;\n\n return expandedIds == null ? options.isRowExpanded === true : expandedIds.includes(item.id);\n}\n\nfunction itemArgs(item: Item, options: ItemBodyOptions): RenderItemArgs<unknown> {\n const args: RenderItemArgs<unknown> = { item: item.value, index: options.position ?? 0 };\n const row = options.row;\n\n if (row === null) {\n return args;\n }\n\n args.depth = row.getDepth();\n\n if (row.isExpandable()) {\n args.isExpanded = isRowWanted(options, item);\n }\n\n return args;\n}\n\nfunction wrapExpander(item: Item, row: Gtk.TreeListRow | null, content: ReactNode): ReactNode {\n const expander: ReactNode =\n row === null\n ? (\n content\n )\n : (\n <GtkTreeExpander\n listRow={row}\n hideExpander={item.hideExpander ?? false}\n indentForDepth={item.indentForDepth ?? true}\n indentForIcon={item.indentForIcon ?? true}\n >\n {content}\n </GtkTreeExpander>\n );\n\n return expander;\n}\n\nfunction itemBody(options: ItemBodyOptions): ReactNode {\n const id = getId(options.item);\n const item = id === null ? undefined : options.collection.itemFor(id);\n\n if (item === undefined) {\n return null;\n }\n\n const render = options.render as ItemRenderer<unknown>;\n\n return wrapExpander(item, options.row, render(itemArgs(item, options)));\n}\n\nfunction ItemCellImpl({ entry, render, collection, expandedIds }: ItemCellProps): ReactNode {\n const item = useSyncExternalStore(entry.subscribe, entry.getItem);\n const position = useProperty(entry.cell, \"position\");\n const row = item instanceof Gtk.TreeListRow ? item : null;\n const isRowExpanded = useProperty(row, \"expanded\");\n const body = itemBody({ item, position, row, isRowExpanded, render, collection, expandedIds });\n\n return createPortal(body, entry.cell, entry.key);\n}\n\nfunction HeaderCellImpl({ entry, render, collection }: HeaderCellProps): ReactNode {\n const item = useSyncExternalStore(entry.subscribe, entry.getItem);\n const id = getId(item);\n const renderHeader = render as HeaderRenderer<unknown>;\n const body = id === null ? null : renderHeader({ section: collection.sectionFor(id) });\n\n return createPortal(body, entry.cell, entry.key);\n}\n\nfunction usePortalEntries<C extends CellHost>(store: CellStore<C>): CellEntry<C>[] {\n return useSyncExternalStore(store.subscribe, store.getSnapshot);\n}\n\nconst ItemPortals = ({ store, render, collection, expandedIds }: ItemPortalsProps): ReactNode =>\n usePortalEntries(store).map((entry) => (\n <ItemCell key={entry.key} entry={entry} render={render} collection={collection} expandedIds={expandedIds} />\n ));\n\nconst HeaderPortals = ({ store, render, collection }: HeaderPortalsProps): ReactNode =>\n usePortalEntries(store).map((entry) => (\n <HeaderCell key={entry.key} entry={entry} render={render} collection={collection} />\n ));\n\nexport {\n useItemCells,\n useHeaderCells,\n ItemPortals,\n HeaderPortals,\n type CellSize,\n type CellStore,\n};\n"]}
@@ -0,0 +1,21 @@
1
+ import type { Item, Section } from "../types.js";
2
+ type Level = {
3
+ key: string;
4
+ ids: string[];
5
+ isExpandable: boolean[];
6
+ };
7
+ type CollectionIndex = {
8
+ isTree: boolean;
9
+ size: number;
10
+ groups: Level[];
11
+ children: Map<string, Level>;
12
+ has: (id: string) => boolean;
13
+ itemFor: (id: string) => Item | undefined;
14
+ sectionFor: (id: string) => unknown;
15
+ positionFor: (id: string) => number;
16
+ };
17
+ declare const ROOT_LEVEL_KEY = "";
18
+ declare const childLevelKey: (id: string) => string;
19
+ declare function createCollectionIndex(items: Item[] | undefined, sections: Section[] | undefined, isFlat: boolean): CollectionIndex;
20
+ export { createCollectionIndex, childLevelKey, ROOT_LEVEL_KEY, type CollectionIndex, type Level };
21
+ //# sourceMappingURL=collection-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-index.d.ts","sourceRoot":"","sources":["../../src/internal/collection-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjD,KAAK,KAAK,GAAG;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,YAAY,EAAE,OAAO,EAAE,CAAC;CAC3B,CAAC;AAEF,KAAK,eAAe,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7B,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC;IAC1C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AAYF,QAAA,MAAM,cAAc,KAAK,CAAC;AAG1B,QAAA,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,MAAuB,CAAC;AAwG5D,iBAAS,qBAAqB,CAC1B,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,EACzB,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,EAC/B,MAAM,EAAE,OAAO,GAChB,eAAe,CAyBjB;AAED,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,KAAK,EAAE,CAAC"}
@@ -0,0 +1,106 @@
1
+ const ROOT_LEVEL_KEY = "";
2
+ const hasChildren = (item) => item.children !== undefined && item.children.length > 0;
3
+ const childLevelKey = (id) => `child:${id}`;
4
+ function collectChildren(state, level, item) {
5
+ if (!state.isTree) {
6
+ return;
7
+ }
8
+ const canExpand = hasChildren(item);
9
+ level.isExpandable.push(canExpand);
10
+ if (!canExpand) {
11
+ return;
12
+ }
13
+ const key = childLevelKey(item.id);
14
+ state.children.set(key, collectLevel(state, key, item.children ?? []));
15
+ }
16
+ function collectLevel(state, key, items) {
17
+ const level = { key, ids: [], isExpandable: [] };
18
+ for (const item of items) {
19
+ level.ids.push(item.id);
20
+ state.itemsById.set(item.id, item);
21
+ collectChildren(state, level, item);
22
+ }
23
+ return level;
24
+ }
25
+ function buildPositions(state) {
26
+ const positions = new Map();
27
+ const starts = [];
28
+ let offset = 0;
29
+ for (const level of state.groups) {
30
+ starts.push(offset);
31
+ for (const id of level.ids) {
32
+ positions.set(id, offset);
33
+ offset += 1;
34
+ }
35
+ }
36
+ state.positions = positions;
37
+ state.starts = starts;
38
+ }
39
+ function positionFor(state, id) {
40
+ if (state.isTree) {
41
+ return -1;
42
+ }
43
+ if (state.positions === null) {
44
+ buildPositions(state);
45
+ }
46
+ return state.positions?.get(id) ?? -1;
47
+ }
48
+ function sectionAt(starts, position) {
49
+ let low = 0;
50
+ let high = starts.length - 1;
51
+ while (low < high) {
52
+ const middle = Math.ceil((low + high) / 2);
53
+ if ((starts[middle] ?? 0) <= position) {
54
+ low = middle;
55
+ }
56
+ else {
57
+ high = middle - 1;
58
+ }
59
+ }
60
+ return low;
61
+ }
62
+ function sectionFor(state, id) {
63
+ const sections = state.sections;
64
+ const position = positionFor(state, id);
65
+ if (sections === undefined || position < 0 || state.starts === null) {
66
+ return undefined;
67
+ }
68
+ return sections[sectionAt(state.starts, position)]?.value;
69
+ }
70
+ function buildGroups(state, source, sections) {
71
+ if (sections === undefined) {
72
+ return [collectLevel(state, ROOT_LEVEL_KEY, source)];
73
+ }
74
+ return sections.map((section) => collectLevel(state, section.id, section.data));
75
+ }
76
+ function isTreeSource(source, sections, isFlat) {
77
+ if (sections !== undefined || isFlat) {
78
+ return false;
79
+ }
80
+ return source.some((item) => hasChildren(item));
81
+ }
82
+ function createCollectionIndex(items, sections, isFlat) {
83
+ const source = items ?? [];
84
+ const state = {
85
+ isTree: isTreeSource(source, sections, isFlat),
86
+ groups: [],
87
+ children: new Map(),
88
+ itemsById: new Map(),
89
+ sections,
90
+ positions: null,
91
+ starts: null,
92
+ };
93
+ state.groups = buildGroups(state, source, sections);
94
+ return {
95
+ isTree: state.isTree,
96
+ size: state.itemsById.size,
97
+ groups: state.groups,
98
+ children: state.children,
99
+ has: (id) => state.itemsById.has(id),
100
+ itemFor: (id) => state.itemsById.get(id),
101
+ sectionFor: (id) => sectionFor(state, id),
102
+ positionFor: (id) => positionFor(state, id),
103
+ };
104
+ }
105
+ export { createCollectionIndex, childLevelKey, ROOT_LEVEL_KEY };
106
+ //# sourceMappingURL=collection-index.js.map