@gtkx/components 1.0.0-rc.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +8 -9
  2. package/dist/adw/combo-row.d.ts +1 -0
  3. package/dist/adw/combo-row.d.ts.map +1 -1
  4. package/dist/adw/combo-row.js.map +1 -1
  5. package/dist/adw/types.d.ts +2 -1
  6. package/dist/adw/types.d.ts.map +1 -1
  7. package/dist/adw/types.js.map +1 -1
  8. package/dist/column-view.d.ts +2 -2
  9. package/dist/column-view.d.ts.map +1 -1
  10. package/dist/column-view.js +15 -13
  11. package/dist/column-view.js.map +1 -1
  12. package/dist/drop-down.d.ts +1 -0
  13. package/dist/drop-down.d.ts.map +1 -1
  14. package/dist/drop-down.js.map +1 -1
  15. package/dist/grid-view.js +2 -2
  16. package/dist/grid-view.js.map +1 -1
  17. package/dist/index.d.ts +1 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +0 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/internal/cells.d.ts +32 -24
  22. package/dist/internal/cells.d.ts.map +1 -1
  23. package/dist/internal/cells.js +168 -77
  24. package/dist/internal/cells.js.map +1 -1
  25. package/dist/internal/collection-index.d.ts +9 -13
  26. package/dist/internal/collection-index.d.ts.map +1 -1
  27. package/dist/internal/collection-index.js +33 -70
  28. package/dist/internal/collection-index.js.map +1 -1
  29. package/dist/internal/collection-model.d.ts +23 -2
  30. package/dist/internal/collection-model.d.ts.map +1 -1
  31. package/dist/internal/collection-model.js +210 -98
  32. package/dist/internal/collection-model.js.map +1 -1
  33. package/dist/internal/collection.d.ts +9 -12
  34. package/dist/internal/collection.d.ts.map +1 -1
  35. package/dist/internal/collection.js +38 -49
  36. package/dist/internal/collection.js.map +1 -1
  37. package/dist/internal/controlled-sync.d.ts +11 -0
  38. package/dist/internal/controlled-sync.d.ts.map +1 -0
  39. package/dist/internal/controlled-sync.js +19 -0
  40. package/dist/internal/controlled-sync.js.map +1 -0
  41. package/dist/internal/drop-down.d.ts.map +1 -1
  42. package/dist/internal/drop-down.js +27 -15
  43. package/dist/internal/drop-down.js.map +1 -1
  44. package/dist/internal/expansion.d.ts +3 -2
  45. package/dist/internal/expansion.d.ts.map +1 -1
  46. package/dist/internal/expansion.js +80 -47
  47. package/dist/internal/expansion.js.map +1 -1
  48. package/dist/internal/keys.d.ts +5 -0
  49. package/dist/internal/keys.d.ts.map +1 -0
  50. package/dist/internal/keys.js +13 -0
  51. package/dist/internal/keys.js.map +1 -0
  52. package/dist/internal/selection.d.ts +3 -2
  53. package/dist/internal/selection.d.ts.map +1 -1
  54. package/dist/internal/selection.js +68 -35
  55. package/dist/internal/selection.js.map +1 -1
  56. package/dist/internal/slots.d.ts +10 -0
  57. package/dist/internal/slots.d.ts.map +1 -0
  58. package/dist/internal/slots.js +43 -0
  59. package/dist/internal/slots.js.map +1 -0
  60. package/dist/internal/tree-expansion.d.ts +20 -0
  61. package/dist/internal/tree-expansion.d.ts.map +1 -0
  62. package/dist/internal/tree-expansion.js +68 -0
  63. package/dist/internal/tree-expansion.js.map +1 -0
  64. package/dist/internal/tree-order.d.ts +27 -0
  65. package/dist/internal/tree-order.d.ts.map +1 -0
  66. package/dist/internal/tree-order.js +71 -0
  67. package/dist/internal/tree-order.js.map +1 -0
  68. package/dist/internal/use-collection.d.ts +5 -5
  69. package/dist/internal/use-collection.d.ts.map +1 -1
  70. package/dist/internal/use-collection.js +6 -6
  71. package/dist/internal/use-collection.js.map +1 -1
  72. package/dist/list-view.d.ts.map +1 -1
  73. package/dist/list-view.js +6 -6
  74. package/dist/list-view.js.map +1 -1
  75. package/dist/types.d.ts +127 -54
  76. package/dist/types.d.ts.map +1 -1
  77. package/dist/types.js.map +1 -1
  78. package/package.json +7 -7
  79. package/src/adw/combo-row.tsx +1 -0
  80. package/src/adw/types.ts +2 -1
  81. package/src/column-view.tsx +38 -35
  82. package/src/drop-down.tsx +1 -0
  83. package/src/grid-view.tsx +2 -2
  84. package/src/index.ts +10 -11
  85. package/src/internal/cells.tsx +345 -123
  86. package/src/internal/collection-index.ts +51 -99
  87. package/src/internal/collection-model.ts +259 -110
  88. package/src/internal/collection.ts +46 -68
  89. package/src/internal/controlled-sync.ts +34 -0
  90. package/src/internal/drop-down.tsx +44 -23
  91. package/src/internal/expansion.ts +104 -67
  92. package/src/internal/keys.ts +18 -0
  93. package/src/internal/selection.tsx +100 -51
  94. package/src/internal/slots.ts +67 -0
  95. package/src/internal/tree-expansion.ts +110 -0
  96. package/src/internal/tree-order.ts +138 -0
  97. package/src/internal/use-collection.tsx +11 -11
  98. package/src/list-view.tsx +14 -10
  99. package/src/types.ts +140 -65
  100. package/dist/size-group.d.ts +0 -12
  101. package/dist/size-group.d.ts.map +0 -1
  102. package/dist/size-group.js +0 -41
  103. package/dist/size-group.js.map +0 -1
  104. package/src/size-group.tsx +0 -77
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from "react";
1
+ import type { ReactNode, RefObject } from "react";
2
2
  import * as Gtk from "@gtkx/gi/gtk";
3
3
  import { GtkColumnView, GtkColumnViewColumn, GtkCustomSorter, GtkSignalListItemFactory } from "@gtkx/jsx/gtk";
4
4
  import { useSignal } from "@gtkx/react";
@@ -6,40 +6,37 @@ import { omit } from "@gtkx/utils";
6
6
  import { useLayoutEffect, useRef } from "react";
7
7
  import type { CellSize } from "./internal/cells.js";
8
8
  import type { Collection } from "./internal/collection.js";
9
- import type { Column, ColumnViewProps } from "./types.js";
10
- import { HeaderPortals, ItemPortals, useHeaderCells, useItemCells } from "./internal/cells.js";
9
+ import type { ColumnViewColumn, ColumnViewProps, ExpanderDescriptions, SortProps } from "./types.js";
10
+ import { ItemPortals, useItemCells, useRowProps, useSectionHeader } from "./internal/cells.js";
11
11
  import { useCollection } from "./internal/use-collection.js";
12
12
  import { useWidgetRef } from "./internal/use-widget-ref.js";
13
13
 
14
- type SortProps = {
15
- sortColumn?: string | null | undefined;
16
- sortOrder?: Gtk.SortType | null | undefined;
17
- onSortChanged?: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;
18
- };
19
-
20
14
  type SortTarget = { view: Gtk.ColumnView; column: Gtk.ColumnViewColumn | null };
21
15
 
22
16
  type ColumnCellsProps = {
23
- column: Column<never>;
17
+ column: ColumnViewColumn<never>;
24
18
  collection: Collection;
25
19
  expandedIds: string[] | null | undefined;
20
+ expanderDescriptions: ExpanderDescriptions | null | undefined;
26
21
  size: CellSize;
27
22
  };
28
23
 
29
24
  type ColumnListProps = Omit<ColumnCellsProps, "column"> & {
30
- columns: Column<never>[];
25
+ columns: ColumnViewColumn<never>[];
31
26
  };
32
27
 
33
28
  const COLUMN_VIEW_PROPS = [
34
29
  "items",
35
30
  "sections",
36
31
  "renderHeader",
32
+ "rowProps",
37
33
  "columns",
38
34
  "selectedIds",
39
35
  "onSelectionChanged",
40
36
  "selectionMode",
41
37
  "expandedIds",
42
38
  "onExpandedChange",
39
+ "expanderDescriptions",
43
40
  "sortColumn",
44
41
  "sortOrder",
45
42
  "onSortChanged",
@@ -77,7 +74,7 @@ const getSortTarget = (view: Gtk.ColumnView | null, sortColumn: string | null |
77
74
  };
78
75
 
79
76
  const applySort = (
80
- sorting: { current: boolean },
77
+ sorting: RefObject<boolean>,
81
78
  view: Gtk.ColumnView,
82
79
  column: Gtk.ColumnViewColumn | null,
83
80
  order: Gtk.SortType | null | undefined,
@@ -93,7 +90,7 @@ const applySort = (
93
90
 
94
91
  const emitSortChanged = (
95
92
  sorter: Gtk.ColumnViewSorter | null,
96
- sorting: { current: boolean },
93
+ sorting: RefObject<boolean>,
97
94
  sort: SortProps,
98
95
  ): void => {
99
96
  if (sorter === null || sorting.current) {
@@ -104,7 +101,7 @@ const emitSortChanged = (
104
101
  };
105
102
 
106
103
  const syncSort = (
107
- sorting: { current: boolean },
104
+ sorting: RefObject<boolean>,
108
105
  view: Gtk.ColumnView | null,
109
106
  sortColumn: string | null | undefined,
110
107
  sortOrder: Gtk.SortType | null | undefined,
@@ -118,7 +115,7 @@ const syncSort = (
118
115
  applySort(sorting, target.view, target.column, sortOrder);
119
116
  };
120
117
 
121
- const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns: Column<never>[]): void => {
118
+ const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns: ColumnViewColumn<never>[]): void => {
122
119
  const sorting = useRef(false);
123
120
  const sorter = view?.getSorter() ?? null;
124
121
  const columnSorter = sorter instanceof Gtk.ColumnViewSorter ? sorter : null;
@@ -134,54 +131,56 @@ const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns:
134
131
  }, [view, sortColumn, sortOrder, columns]);
135
132
  };
136
133
 
137
- const ColumnCells = ({ column, collection, expandedIds, size }: ColumnCellsProps): ReactNode => {
134
+ const ColumnCells = ({ column, collection, expandedIds, expanderDescriptions, size }: ColumnCellsProps): ReactNode => {
138
135
  const cells = useItemCells(size);
139
- const rest = omit(column, ["id", "renderCell", "sortable"]);
136
+ const rest = omit(column, ["id", "renderCell", "isSortable"]);
140
137
 
141
138
  return (
142
139
  <>
143
140
  <GtkColumnViewColumn
144
141
  id={column.id}
145
142
  factory={<GtkSignalListItemFactory {...cells.handlers} />}
146
- sorter={column.sortable === true ? <GtkCustomSorter /> : null}
143
+ sorter={column.isSortable === true ? <GtkCustomSorter /> : null}
147
144
  {...rest}
148
145
  />
149
146
  <ItemPortals
150
- store={cells}
147
+ registry={cells}
151
148
  render={column.renderCell}
152
149
  collection={collection}
153
150
  expandedIds={expandedIds}
151
+ expanderDescriptions={expanderDescriptions}
154
152
  />
155
153
  </>
156
154
  );
157
155
  };
158
156
 
159
- const ColumnList = ({ columns, collection, expandedIds, size }: ColumnListProps): ReactNode =>
157
+ const ColumnList = ({ columns, collection, expandedIds, expanderDescriptions, size }: ColumnListProps): ReactNode =>
160
158
  columns.map((column) => (
161
159
  <ColumnCells
162
160
  key={column.id}
163
161
  column={column}
164
162
  collection={collection}
165
163
  expandedIds={expandedIds}
164
+ expanderDescriptions={expanderDescriptions}
166
165
  size={size}
167
166
  />
168
167
  ));
169
168
 
170
169
  /**
171
170
  * Renders a Gtk.ColumnView from declarative items or sections and a columns array,
172
- * with controlled selection, expansion, and sorting, per-column header menus, and
173
- * section header rendering.
171
+ * with controlled selection, expansion, and sorting, per-column header menus,
172
+ * section header rendering, and per-row props such as a screen-reader label.
174
173
  */
175
174
  function ColumnView<T = unknown, S = unknown>(props: ColumnViewProps<T, S>): ReactNode {
176
- const { renderHeader, columns, expandedIds, sortColumn, sortOrder, onSortChanged, estimatedItemHeight, ref } =
177
- props;
178
-
175
+ const { renderHeader, rowProps, columns, expandedIds, expanderDescriptions } = props;
176
+ const { sortColumn, sortOrder, onSortChanged, ref } = props;
179
177
  const rest = omit(props, COLUMN_VIEW_PROPS);
178
+ const size = { width: -1, height: props.estimatedItemHeight ?? -1 };
180
179
  const [view, refCallback] = useWidgetRef<Gtk.ColumnView>(ref);
181
- const size = { width: -1, height: estimatedItemHeight ?? -1 };
182
180
  const { collection, selection } = useCollection(props);
183
- const headerCells = useHeaderCells(size);
184
- const columnList = columns as Column<never>[];
181
+ const header = useSectionHeader(renderHeader, collection, size);
182
+ const rows = useRowProps(rowProps, collection, expandedIds);
183
+ const columnList = columns as ColumnViewColumn<never>[];
185
184
  useColumnSorting(view, { sortColumn, sortOrder, onSortChanged }, columnList);
186
185
 
187
186
  return (
@@ -189,16 +188,20 @@ function ColumnView<T = unknown, S = unknown>(props: ColumnViewProps<T, S>): Rea
189
188
  <GtkColumnView
190
189
  ref={refCallback}
191
190
  model={selection}
192
- {...(renderHeader != null && {
193
- headerFactory: <GtkSignalListItemFactory {...headerCells.handlers} />,
194
- })}
191
+ {...header.factoryProps}
192
+ {...rows.factoryProps}
195
193
  {...rest}
196
194
  >
197
- <ColumnList columns={columnList} collection={collection} expandedIds={expandedIds} size={size} />
195
+ <ColumnList
196
+ columns={columnList}
197
+ collection={collection}
198
+ expandedIds={expandedIds}
199
+ expanderDescriptions={expanderDescriptions}
200
+ size={size}
201
+ />
198
202
  </GtkColumnView>
199
- {renderHeader != null && (
200
- <HeaderPortals store={headerCells} render={renderHeader} collection={collection} />
201
- )}
203
+ {header.portals}
204
+ {rows.portals}
202
205
  </>
203
206
  );
204
207
  }
package/src/drop-down.tsx CHANGED
@@ -4,6 +4,7 @@ import type { DropDownBaseProps } from "./internal/drop-down.js";
4
4
  import type { DropDownProps } from "./types.js";
5
5
  import { DropDownBase } from "./internal/drop-down.js";
6
6
 
7
+ /** Call signature of {@link DropDown}, generic in the item and section value types. */
7
8
  type DropDownComponent = <T = unknown, S = unknown>(props: DropDownProps<T, S>) => ReactNode;
8
9
 
9
10
  /**
package/src/grid-view.tsx CHANGED
@@ -23,13 +23,13 @@ function GridView<T = unknown>(props: GridViewProps<T>): ReactNode {
23
23
  const { renderItem, estimatedItemHeight, estimatedItemWidth } = props;
24
24
  const rest = omit(props, GRID_VIEW_PROPS);
25
25
  const size = { width: estimatedItemWidth ?? -1, height: estimatedItemHeight ?? -1 };
26
- const { collection, selection } = useCollection({ ...props, flat: true });
26
+ const { collection, selection } = useCollection({ ...props, isFlat: true });
27
27
  const itemCells = useItemCells(size);
28
28
 
29
29
  return (
30
30
  <>
31
31
  <GtkGridView model={selection} factory={<GtkSignalListItemFactory {...itemCells.handlers} />} {...rest} />
32
- <ItemPortals store={itemCells} render={renderItem} collection={collection} />
32
+ <ItemPortals registry={itemCells} render={renderItem} collection={collection} />
33
33
  </>
34
34
  );
35
35
  }
package/src/index.ts CHANGED
@@ -2,20 +2,19 @@ export { ColumnView } from "./column-view.js";
2
2
  export { DropDown } from "./drop-down.js";
3
3
  export { GridView } from "./grid-view.js";
4
4
  export { ListView } from "./list-view.js";
5
- export { SizeGroup } from "./size-group.js";
6
5
  export type {
7
- ChildProps,
8
- Column,
6
+ ColumnViewColumn,
9
7
  ColumnViewProps,
10
8
  DropDownProps,
9
+ ExpanderDescriptions,
11
10
  GridViewProps,
12
- HeaderRenderer,
13
- Item,
14
- ItemRenderer,
11
+ ListItem,
12
+ ListItemRenderArgs,
13
+ ListItemRenderer,
14
+ ListRowProps,
15
+ ListRowPropsResolver,
16
+ ListSection,
17
+ ListSectionRenderArgs,
18
+ ListSectionRenderer,
15
19
  ListViewProps,
16
- RenderHeaderArgs,
17
- RenderItemArgs,
18
- Section,
19
- SizeGroupChildProps,
20
- SizeGroupProps,
21
20
  } from "./types.js";