@fusion.dev/helix-headless 0.5.0 → 0.7.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.
package/types/jsx.d.ts CHANGED
@@ -3838,6 +3838,20 @@ export type HelixHeadlessDataTableProps = {
3838
3838
  "default-sort"?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
3839
3839
  /** Order to open on, where nothing declared one. */
3840
3840
  defaultSort?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
3841
+ /** How tall a row is taken to be before it has been drawn, in pixels.
3842
+
3843
+ Only read while `windowed`, and a starting guess rather than a claim: a
3844
+ cell that wraps makes its row taller than its neighbors, and the window
3845
+ replaces this with what each row came to as it draws. It still has to be
3846
+ close, because it is what the scrollbar is built from before anything has
3847
+ been measured. */
3848
+ estimate?: (HelixHeadlessDataTable["estimate"]) | undefined;
3849
+ /** The order, as `field:direction`.
3850
+
3851
+ Set it and this element defers: a reader's click fires `helix-sort` and
3852
+ changes nothing until a new value arrives. `default-sort` seeds an order this
3853
+ element then owns. */
3854
+ sort?: (HelixHeadlessDataTable["sort"]) | undefined;
3841
3855
  /** The field naming a row's stable identity.
3842
3856
 
3843
3857
  **Needed before selection exists, not after.** Lit keys the rendered rows by
@@ -3847,20 +3861,20 @@ attached to the row it belongs to. Left unset the index is the key, which is
3847
3861
  correct only while nothing reorders: it is why this defaults to something
3848
3862
  that works and is worth setting anyway. */
3849
3863
  key?: (HelixHeadlessDataTable["key"]) | undefined;
3850
- /** The order, as `field:direction`.
3851
-
3852
- Set it and this element defers: a reader's click fires `helix-sort` and
3853
- changes nothing until a new value arrives. `default-sort` seeds an order this
3854
- element then owns. */
3855
- sort?: (HelixHeadlessDataTable["sort"]) | undefined;
3856
- /** Accessible name for the grid. */
3857
- label?: (HelixHeadlessDataTable["label"]) | undefined;
3858
3864
  /** What the rows are narrowed to, as one query across every column.
3859
3865
 
3860
3866
  One query rather than a predicate per column, which is what a reader means
3861
3867
  by a search box above a table. It matches on each column's ordering value,
3862
3868
  so search and sort cannot disagree about what a column holds. */
3863
3869
  filter?: (HelixHeadlessDataTable["filter"]) | undefined;
3870
+ /** Accessible name for the grid. */
3871
+ label?: (HelixHeadlessDataTable["label"]) | undefined;
3872
+ /** The page on show, from 1.
3873
+
3874
+ Clamped on the way out, so what this reports is the page it drew: a
3875
+ bookmarked link to page 99 of a result that has since shrunk reads back as
3876
+ the last page rather than as 99. */
3877
+ page?: (HelixHeadlessDataTable["page"]) | undefined;
3864
3878
  /** Whether this element does the work or asks the consumer to.
3865
3879
 
3866
3880
  `client` filters, sorts and pages `rows` itself. `server` applies none of
@@ -3870,12 +3884,6 @@ the client cannot hold the data, so this is not an optimization, it is the
3870
3884
  only mode that works, and it is here from the start because adding it later
3871
3885
  inverts the data flow. */
3872
3886
  mode?: (HelixHeadlessDataTable["mode"]) | undefined;
3873
- /** The page on show, from 1.
3874
-
3875
- Clamped on the way out, so what this reports is the page it drew: a
3876
- bookmarked link to page 99 of a result that has since shrunk reads back as
3877
- the last page rather than as 99. */
3878
- page?: (HelixHeadlessDataTable["page"]) | undefined;
3879
3887
  /** How many rows a page holds. Zero is every row, which is what "no paging" means.
3880
3888
 
3881
3889
  **It announces nothing, and that is not an omission.** Nothing in this
@@ -3899,6 +3907,24 @@ nothing about the result. Ignored in `client` mode rather than trusted,
3899
3907
  because two sources for one count is the mistake, and here the array is the
3900
3908
  one that cannot be stale. */
3901
3909
  total?: (HelixHeadlessDataTable["total"]) | undefined;
3910
+ /** Draws the rows in view and stands empty space in for the rest.
3911
+
3912
+ **Not a `mode`.** `mode` says where the rows come from and who filtered
3913
+ them; this says how many of the ones we hold get drawn. They are
3914
+ independent: a consumer fetching five thousand rows a chunk at a time wants
3915
+ `mode="server"` and this at once, and folding this into `mode` would be an
3916
+ API that forbids that combination for no reason.
3917
+
3918
+ **Composes with `paginated` rather than excluding it.** A window over a
3919
+ page is coherent -- the page is the slice of the result, the window is the
3920
+ part of that slice on screen -- and the arithmetic is the same either way,
3921
+ so there is nothing to forbid. Together they suit a table paging at a
3922
+ thousand rows, where the page is a reasonable fetch and a poor render.
3923
+
3924
+ Off by default. Windowing costs a scroll listener, a measurement per row
3925
+ drawn, and a `block-size` on the scrolling box, and a table of twenty rows
3926
+ should pay none of them. */
3927
+ windowed?: (HelixHeadlessDataTable["windowed"]) | undefined;
3902
3928
  /** Whether to draw a pagination under the grid.
3903
3929
 
3904
3930
  On by default once a page size is set, because a paged table with no way to
@@ -3958,6 +3984,20 @@ export type HelixHeadlessDataTableSolidJsProps = {
3958
3984
  "attr:default-sort"?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
3959
3985
  /** Order to open on, where nothing declared one. */
3960
3986
  "prop:defaultSort"?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
3987
+ /** How tall a row is taken to be before it has been drawn, in pixels.
3988
+
3989
+ Only read while `windowed`, and a starting guess rather than a claim: a
3990
+ cell that wraps makes its row taller than its neighbors, and the window
3991
+ replaces this with what each row came to as it draws. It still has to be
3992
+ close, because it is what the scrollbar is built from before anything has
3993
+ been measured. */
3994
+ "prop:estimate"?: (HelixHeadlessDataTable["estimate"]) | undefined;
3995
+ /** The order, as `field:direction`.
3996
+
3997
+ Set it and this element defers: a reader's click fires `helix-sort` and
3998
+ changes nothing until a new value arrives. `default-sort` seeds an order this
3999
+ element then owns. */
4000
+ "prop:sort"?: (HelixHeadlessDataTable["sort"]) | undefined;
3961
4001
  /** The field naming a row's stable identity.
3962
4002
 
3963
4003
  **Needed before selection exists, not after.** Lit keys the rendered rows by
@@ -3967,20 +4007,20 @@ attached to the row it belongs to. Left unset the index is the key, which is
3967
4007
  correct only while nothing reorders: it is why this defaults to something
3968
4008
  that works and is worth setting anyway. */
3969
4009
  "prop:key"?: (HelixHeadlessDataTable["key"]) | undefined;
3970
- /** The order, as `field:direction`.
3971
-
3972
- Set it and this element defers: a reader's click fires `helix-sort` and
3973
- changes nothing until a new value arrives. `default-sort` seeds an order this
3974
- element then owns. */
3975
- "prop:sort"?: (HelixHeadlessDataTable["sort"]) | undefined;
3976
- /** Accessible name for the grid. */
3977
- "prop:label"?: (HelixHeadlessDataTable["label"]) | undefined;
3978
4010
  /** What the rows are narrowed to, as one query across every column.
3979
4011
 
3980
4012
  One query rather than a predicate per column, which is what a reader means
3981
4013
  by a search box above a table. It matches on each column's ordering value,
3982
4014
  so search and sort cannot disagree about what a column holds. */
3983
4015
  "prop:filter"?: (HelixHeadlessDataTable["filter"]) | undefined;
4016
+ /** Accessible name for the grid. */
4017
+ "prop:label"?: (HelixHeadlessDataTable["label"]) | undefined;
4018
+ /** The page on show, from 1.
4019
+
4020
+ Clamped on the way out, so what this reports is the page it drew: a
4021
+ bookmarked link to page 99 of a result that has since shrunk reads back as
4022
+ the last page rather than as 99. */
4023
+ "prop:page"?: (HelixHeadlessDataTable["page"]) | undefined;
3984
4024
  /** Whether this element does the work or asks the consumer to.
3985
4025
 
3986
4026
  `client` filters, sorts and pages `rows` itself. `server` applies none of
@@ -3990,12 +4030,6 @@ the client cannot hold the data, so this is not an optimization, it is the
3990
4030
  only mode that works, and it is here from the start because adding it later
3991
4031
  inverts the data flow. */
3992
4032
  "prop:mode"?: (HelixHeadlessDataTable["mode"]) | undefined;
3993
- /** The page on show, from 1.
3994
-
3995
- Clamped on the way out, so what this reports is the page it drew: a
3996
- bookmarked link to page 99 of a result that has since shrunk reads back as
3997
- the last page rather than as 99. */
3998
- "prop:page"?: (HelixHeadlessDataTable["page"]) | undefined;
3999
4033
  /** How many rows a page holds. Zero is every row, which is what "no paging" means.
4000
4034
 
4001
4035
  **It announces nothing, and that is not an omission.** Nothing in this
@@ -4019,6 +4053,24 @@ nothing about the result. Ignored in `client` mode rather than trusted,
4019
4053
  because two sources for one count is the mistake, and here the array is the
4020
4054
  one that cannot be stale. */
4021
4055
  "prop:total"?: (HelixHeadlessDataTable["total"]) | undefined;
4056
+ /** Draws the rows in view and stands empty space in for the rest.
4057
+
4058
+ **Not a `mode`.** `mode` says where the rows come from and who filtered
4059
+ them; this says how many of the ones we hold get drawn. They are
4060
+ independent: a consumer fetching five thousand rows a chunk at a time wants
4061
+ `mode="server"` and this at once, and folding this into `mode` would be an
4062
+ API that forbids that combination for no reason.
4063
+
4064
+ **Composes with `paginated` rather than excluding it.** A window over a
4065
+ page is coherent -- the page is the slice of the result, the window is the
4066
+ part of that slice on screen -- and the arithmetic is the same either way,
4067
+ so there is nothing to forbid. Together they suit a table paging at a
4068
+ thousand rows, where the page is a reasonable fetch and a poor render.
4069
+
4070
+ Off by default. Windowing costs a scroll listener, a measurement per row
4071
+ drawn, and a `block-size` on the scrolling box, and a table of twenty rows
4072
+ should pay none of them. */
4073
+ "prop:windowed"?: (HelixHeadlessDataTable["windowed"]) | undefined;
4022
4074
  /** Whether to draw a pagination under the grid.
4023
4075
 
4024
4076
  On by default once a page size is set, because a paged table with no way to
@@ -15296,21 +15348,43 @@ past the end is the one write the platform answers with an exception. */
15296
15348
  };
15297
15349
 
15298
15350
  export type HelixHeadlessVirtualListProps = {
15299
- /** How tall one row is, in pixels, used to map scroll offset to an index. */
15351
+ /** How tall one row is, in pixels, used to map scroll offset to an index.
15352
+
15353
+ An estimate rather than a measurement while `measured` is off, which is
15354
+ right whenever the rows really are one height and is the cheaper of the two. */
15300
15355
  estimate?: (HelixHeadlessVirtualList["estimate"]) | undefined;
15301
15356
  /** Id of the element holding the rows, as JSON in a script. */
15302
15357
  for?: (HelixHeadlessVirtualList["for"]) | undefined;
15303
15358
  /** What the list is called, since the rendered rows are only a window on it. */
15304
15359
  label?: (HelixHeadlessVirtualList["label"]) | undefined;
15360
+ /** Places rows by what they came to rather than by `estimate`.
15361
+
15362
+ **Off by default, because the straight line is better when it holds.** One
15363
+ estimate makes offset and index convert by division, which can never
15364
+ disagree with itself; measuring is what a set of genuinely different
15365
+ heights needs and costs a read of each row as it renders. A list of
15366
+ one-line rows should leave this alone. */
15367
+ measured?: (HelixHeadlessVirtualList["measured"]) | undefined;
15305
15368
  };
15306
15369
 
15307
15370
  export type HelixHeadlessVirtualListSolidJsProps = {
15308
- /** How tall one row is, in pixels, used to map scroll offset to an index. */
15371
+ /** How tall one row is, in pixels, used to map scroll offset to an index.
15372
+
15373
+ An estimate rather than a measurement while `measured` is off, which is
15374
+ right whenever the rows really are one height and is the cheaper of the two. */
15309
15375
  "prop:estimate"?: (HelixHeadlessVirtualList["estimate"]) | undefined;
15310
15376
  /** Id of the element holding the rows, as JSON in a script. */
15311
15377
  "prop:for"?: (HelixHeadlessVirtualList["for"]) | undefined;
15312
15378
  /** What the list is called, since the rendered rows are only a window on it. */
15313
15379
  "prop:label"?: (HelixHeadlessVirtualList["label"]) | undefined;
15380
+ /** Places rows by what they came to rather than by `estimate`.
15381
+
15382
+ **Off by default, because the straight line is better when it holds.** One
15383
+ estimate makes offset and index convert by division, which can never
15384
+ disagree with itself; measuring is what a set of genuinely different
15385
+ heights needs and costs a read of each row as it renders. A list of
15386
+ one-line rows should leave this alone. */
15387
+ "prop:measured"?: (HelixHeadlessVirtualList["measured"]) | undefined;
15314
15388
 
15315
15389
  /** Set the innerHTML of the element */
15316
15390
  innerHTML?: (string) | undefined;
@@ -18736,6 +18810,18 @@ export type CustomElements = {
18736
18810
  * - `default-page`/`defaultPage`: Page to open on, where nothing declared one.
18737
18811
  * - `default-page-size`/`defaultPageSize`: Page size to open with, where nothing declared one.
18738
18812
  * - `default-sort`/`defaultSort`: Order to open on, where nothing declared one.
18813
+ * - `estimate`: How tall a row is taken to be before it has been drawn, in pixels.
18814
+ *
18815
+ * Only read while `windowed`, and a starting guess rather than a claim: a
18816
+ * cell that wraps makes its row taller than its neighbors, and the window
18817
+ * replaces this with what each row came to as it draws. It still has to be
18818
+ * close, because it is what the scrollbar is built from before anything has
18819
+ * been measured.
18820
+ * - `sort`: The order, as `field:direction`.
18821
+ *
18822
+ * Set it and this element defers: a reader's click fires `helix-sort` and
18823
+ * changes nothing until a new value arrives. `default-sort` seeds an order this
18824
+ * element then owns.
18739
18825
  * - `key`: The field naming a row's stable identity.
18740
18826
  *
18741
18827
  * **Needed before selection exists, not after.** Lit keys the rendered rows by
@@ -18744,17 +18830,17 @@ export type CustomElements = {
18744
18830
  * attached to the row it belongs to. Left unset the index is the key, which is
18745
18831
  * correct only while nothing reorders: it is why this defaults to something
18746
18832
  * that works and is worth setting anyway.
18747
- * - `sort`: The order, as `field:direction`.
18748
- *
18749
- * Set it and this element defers: a reader's click fires `helix-sort` and
18750
- * changes nothing until a new value arrives. `default-sort` seeds an order this
18751
- * element then owns.
18752
- * - `label`: Accessible name for the grid.
18753
18833
  * - `filter`: What the rows are narrowed to, as one query across every column.
18754
18834
  *
18755
18835
  * One query rather than a predicate per column, which is what a reader means
18756
18836
  * by a search box above a table. It matches on each column's ordering value,
18757
18837
  * so search and sort cannot disagree about what a column holds.
18838
+ * - `label`: Accessible name for the grid.
18839
+ * - `page`: The page on show, from 1.
18840
+ *
18841
+ * Clamped on the way out, so what this reports is the page it drew: a
18842
+ * bookmarked link to page 99 of a result that has since shrunk reads back as
18843
+ * the last page rather than as 99.
18758
18844
  * - `mode`: Whether this element does the work or asks the consumer to.
18759
18845
  *
18760
18846
  * `client` filters, sorts and pages `rows` itself. `server` applies none of
@@ -18763,11 +18849,6 @@ export type CustomElements = {
18763
18849
  * the client cannot hold the data, so this is not an optimization, it is the
18764
18850
  * only mode that works, and it is here from the start because adding it later
18765
18851
  * inverts the data flow.
18766
- * - `page`: The page on show, from 1.
18767
- *
18768
- * Clamped on the way out, so what this reports is the page it drew: a
18769
- * bookmarked link to page 99 of a result that has since shrunk reads back as
18770
- * the last page rather than as 99.
18771
18852
  * - `page-size`/`pageSize`: How many rows a page holds. Zero is every row, which is what "no paging" means.
18772
18853
  *
18773
18854
  * **It announces nothing, and that is not an omission.** Nothing in this
@@ -18781,6 +18862,23 @@ export type CustomElements = {
18781
18862
  * nothing about the result. Ignored in `client` mode rather than trusted,
18782
18863
  * because two sources for one count is the mistake, and here the array is the
18783
18864
  * one that cannot be stale.
18865
+ * - `windowed`: Draws the rows in view and stands empty space in for the rest.
18866
+ *
18867
+ * **Not a `mode`.** `mode` says where the rows come from and who filtered
18868
+ * them; this says how many of the ones we hold get drawn. They are
18869
+ * independent: a consumer fetching five thousand rows a chunk at a time wants
18870
+ * `mode="server"` and this at once, and folding this into `mode` would be an
18871
+ * API that forbids that combination for no reason.
18872
+ *
18873
+ * **Composes with `paginated` rather than excluding it.** A window over a
18874
+ * page is coherent -- the page is the slice of the result, the window is the
18875
+ * part of that slice on screen -- and the arithmetic is the same either way,
18876
+ * so there is nothing to forbid. Together they suit a table paging at a
18877
+ * thousand rows, where the page is a reasonable fetch and a poor render.
18878
+ *
18879
+ * Off by default. Windowing costs a scroll listener, a measurement per row
18880
+ * drawn, and a `block-size` on the scrolling box, and a table of twenty rows
18881
+ * should pay none of them.
18784
18882
  * - `paginated`: Whether to draw a pagination under the grid.
18785
18883
  *
18786
18884
  * On by default once a page size is set, because a paged table with no way to
@@ -18863,6 +18961,8 @@ export type CustomElements = {
18863
18961
  *
18864
18962
  * Custom selectors for styling elements within the component.
18865
18963
  *
18964
+ * - `after`: The room the rows below the window would have taken. Windowed only.
18965
+ * - `before`: The room the rows above the window would have taken. Windowed only.
18866
18966
  * - `cell`: One cell.
18867
18967
  * - `empty`: Shown when no rows match.
18868
18968
  * - `footer`: The region below the grid.
@@ -29423,8 +29523,18 @@ export type CustomElements = {
29423
29523
  * Component attributes and properties that can be applied to the element or by using JavaScript.
29424
29524
  *
29425
29525
  * - `estimate`: How tall one row is, in pixels, used to map scroll offset to an index.
29526
+ *
29527
+ * An estimate rather than a measurement while `measured` is off, which is
29528
+ * right whenever the rows really are one height and is the cheaper of the two.
29426
29529
  * - `for`: Id of the element holding the rows, as JSON in a script.
29427
29530
  * - `label`: What the list is called, since the rendered rows are only a window on it.
29531
+ * - `measured`: Places rows by what they came to rather than by `estimate`.
29532
+ *
29533
+ * **Off by default, because the straight line is better when it holds.** One
29534
+ * estimate makes offset and index convert by division, which can never
29535
+ * disagree with itself; measuring is what a set of genuinely different
29536
+ * heights needs and costs a read of each row as it renders. A list of
29537
+ * one-line rows should leave this alone.
29428
29538
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
29429
29539
  *
29430
29540
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -32935,6 +33045,18 @@ export type CustomElementsSolidJs = {
32935
33045
  * - `default-page`/`defaultPage`: Page to open on, where nothing declared one.
32936
33046
  * - `default-page-size`/`defaultPageSize`: Page size to open with, where nothing declared one.
32937
33047
  * - `default-sort`/`defaultSort`: Order to open on, where nothing declared one.
33048
+ * - `estimate`: How tall a row is taken to be before it has been drawn, in pixels.
33049
+ *
33050
+ * Only read while `windowed`, and a starting guess rather than a claim: a
33051
+ * cell that wraps makes its row taller than its neighbors, and the window
33052
+ * replaces this with what each row came to as it draws. It still has to be
33053
+ * close, because it is what the scrollbar is built from before anything has
33054
+ * been measured.
33055
+ * - `sort`: The order, as `field:direction`.
33056
+ *
33057
+ * Set it and this element defers: a reader's click fires `helix-sort` and
33058
+ * changes nothing until a new value arrives. `default-sort` seeds an order this
33059
+ * element then owns.
32938
33060
  * - `key`: The field naming a row's stable identity.
32939
33061
  *
32940
33062
  * **Needed before selection exists, not after.** Lit keys the rendered rows by
@@ -32943,17 +33065,17 @@ export type CustomElementsSolidJs = {
32943
33065
  * attached to the row it belongs to. Left unset the index is the key, which is
32944
33066
  * correct only while nothing reorders: it is why this defaults to something
32945
33067
  * that works and is worth setting anyway.
32946
- * - `sort`: The order, as `field:direction`.
32947
- *
32948
- * Set it and this element defers: a reader's click fires `helix-sort` and
32949
- * changes nothing until a new value arrives. `default-sort` seeds an order this
32950
- * element then owns.
32951
- * - `label`: Accessible name for the grid.
32952
33068
  * - `filter`: What the rows are narrowed to, as one query across every column.
32953
33069
  *
32954
33070
  * One query rather than a predicate per column, which is what a reader means
32955
33071
  * by a search box above a table. It matches on each column's ordering value,
32956
33072
  * so search and sort cannot disagree about what a column holds.
33073
+ * - `label`: Accessible name for the grid.
33074
+ * - `page`: The page on show, from 1.
33075
+ *
33076
+ * Clamped on the way out, so what this reports is the page it drew: a
33077
+ * bookmarked link to page 99 of a result that has since shrunk reads back as
33078
+ * the last page rather than as 99.
32957
33079
  * - `mode`: Whether this element does the work or asks the consumer to.
32958
33080
  *
32959
33081
  * `client` filters, sorts and pages `rows` itself. `server` applies none of
@@ -32962,11 +33084,6 @@ export type CustomElementsSolidJs = {
32962
33084
  * the client cannot hold the data, so this is not an optimization, it is the
32963
33085
  * only mode that works, and it is here from the start because adding it later
32964
33086
  * inverts the data flow.
32965
- * - `page`: The page on show, from 1.
32966
- *
32967
- * Clamped on the way out, so what this reports is the page it drew: a
32968
- * bookmarked link to page 99 of a result that has since shrunk reads back as
32969
- * the last page rather than as 99.
32970
33087
  * - `page-size`/`pageSize`: How many rows a page holds. Zero is every row, which is what "no paging" means.
32971
33088
  *
32972
33089
  * **It announces nothing, and that is not an omission.** Nothing in this
@@ -32980,6 +33097,23 @@ export type CustomElementsSolidJs = {
32980
33097
  * nothing about the result. Ignored in `client` mode rather than trusted,
32981
33098
  * because two sources for one count is the mistake, and here the array is the
32982
33099
  * one that cannot be stale.
33100
+ * - `windowed`: Draws the rows in view and stands empty space in for the rest.
33101
+ *
33102
+ * **Not a `mode`.** `mode` says where the rows come from and who filtered
33103
+ * them; this says how many of the ones we hold get drawn. They are
33104
+ * independent: a consumer fetching five thousand rows a chunk at a time wants
33105
+ * `mode="server"` and this at once, and folding this into `mode` would be an
33106
+ * API that forbids that combination for no reason.
33107
+ *
33108
+ * **Composes with `paginated` rather than excluding it.** A window over a
33109
+ * page is coherent -- the page is the slice of the result, the window is the
33110
+ * part of that slice on screen -- and the arithmetic is the same either way,
33111
+ * so there is nothing to forbid. Together they suit a table paging at a
33112
+ * thousand rows, where the page is a reasonable fetch and a poor render.
33113
+ *
33114
+ * Off by default. Windowing costs a scroll listener, a measurement per row
33115
+ * drawn, and a `block-size` on the scrolling box, and a table of twenty rows
33116
+ * should pay none of them.
32983
33117
  * - `paginated`: Whether to draw a pagination under the grid.
32984
33118
  *
32985
33119
  * On by default once a page size is set, because a paged table with no way to
@@ -33062,6 +33196,8 @@ export type CustomElementsSolidJs = {
33062
33196
  *
33063
33197
  * Custom selectors for styling elements within the component.
33064
33198
  *
33199
+ * - `after`: The room the rows below the window would have taken. Windowed only.
33200
+ * - `before`: The room the rows above the window would have taken. Windowed only.
33065
33201
  * - `cell`: One cell.
33066
33202
  * - `empty`: Shown when no rows match.
33067
33203
  * - `footer`: The region below the grid.
@@ -43837,8 +43973,18 @@ export type CustomElementsSolidJs = {
43837
43973
  * Component attributes and properties that can be applied to the element or by using JavaScript.
43838
43974
  *
43839
43975
  * - `estimate`: How tall one row is, in pixels, used to map scroll offset to an index.
43976
+ *
43977
+ * An estimate rather than a measurement while `measured` is off, which is
43978
+ * right whenever the rows really are one height and is the cheaper of the two.
43840
43979
  * - `for`: Id of the element holding the rows, as JSON in a script.
43841
43980
  * - `label`: What the list is called, since the rendered rows are only a window on it.
43981
+ * - `measured`: Places rows by what they came to rather than by `estimate`.
43982
+ *
43983
+ * **Off by default, because the straight line is better when it holds.** One
43984
+ * estimate makes offset and index convert by division, which can never
43985
+ * disagree with itself; measuring is what a set of genuinely different
43986
+ * heights needs and costs a read of each row as it renders. A list of
43987
+ * one-line rows should leave this alone.
43842
43988
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
43843
43989
  *
43844
43990
  * **Named `whenSettled` because `settled` is taken four times over**, by
package/types/vue.d.ts CHANGED
@@ -1985,6 +1985,20 @@ export type HelixHeadlessDataTableVueProps = {
1985
1985
  "default-sort"?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
1986
1986
  /** Order to open on, where nothing declared one. */
1987
1987
  defaultSort?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
1988
+ /** How tall a row is taken to be before it has been drawn, in pixels.
1989
+
1990
+ Only read while `windowed`, and a starting guess rather than a claim: a
1991
+ cell that wraps makes its row taller than its neighbors, and the window
1992
+ replaces this with what each row came to as it draws. It still has to be
1993
+ close, because it is what the scrollbar is built from before anything has
1994
+ been measured. */
1995
+ estimate?: (HelixHeadlessDataTable["estimate"]) | undefined;
1996
+ /** The order, as `field:direction`.
1997
+
1998
+ Set it and this element defers: a reader's click fires `helix-sort` and
1999
+ changes nothing until a new value arrives. `default-sort` seeds an order this
2000
+ element then owns. */
2001
+ sort?: (HelixHeadlessDataTable["sort"]) | undefined;
1988
2002
  /** The field naming a row's stable identity.
1989
2003
 
1990
2004
  **Needed before selection exists, not after.** Lit keys the rendered rows by
@@ -1994,20 +2008,20 @@ attached to the row it belongs to. Left unset the index is the key, which is
1994
2008
  correct only while nothing reorders: it is why this defaults to something
1995
2009
  that works and is worth setting anyway. */
1996
2010
  key?: (HelixHeadlessDataTable["key"]) | undefined;
1997
- /** The order, as `field:direction`.
1998
-
1999
- Set it and this element defers: a reader's click fires `helix-sort` and
2000
- changes nothing until a new value arrives. `default-sort` seeds an order this
2001
- element then owns. */
2002
- sort?: (HelixHeadlessDataTable["sort"]) | undefined;
2003
- /** Accessible name for the grid. */
2004
- label?: (HelixHeadlessDataTable["label"]) | undefined;
2005
2011
  /** What the rows are narrowed to, as one query across every column.
2006
2012
 
2007
2013
  One query rather than a predicate per column, which is what a reader means
2008
2014
  by a search box above a table. It matches on each column's ordering value,
2009
2015
  so search and sort cannot disagree about what a column holds. */
2010
2016
  filter?: (HelixHeadlessDataTable["filter"]) | undefined;
2017
+ /** Accessible name for the grid. */
2018
+ label?: (HelixHeadlessDataTable["label"]) | undefined;
2019
+ /** The page on show, from 1.
2020
+
2021
+ Clamped on the way out, so what this reports is the page it drew: a
2022
+ bookmarked link to page 99 of a result that has since shrunk reads back as
2023
+ the last page rather than as 99. */
2024
+ page?: (HelixHeadlessDataTable["page"]) | undefined;
2011
2025
  /** Whether this element does the work or asks the consumer to.
2012
2026
 
2013
2027
  `client` filters, sorts and pages `rows` itself. `server` applies none of
@@ -2017,12 +2031,6 @@ the client cannot hold the data, so this is not an optimization, it is the
2017
2031
  only mode that works, and it is here from the start because adding it later
2018
2032
  inverts the data flow. */
2019
2033
  mode?: (HelixHeadlessDataTable["mode"]) | undefined;
2020
- /** The page on show, from 1.
2021
-
2022
- Clamped on the way out, so what this reports is the page it drew: a
2023
- bookmarked link to page 99 of a result that has since shrunk reads back as
2024
- the last page rather than as 99. */
2025
- page?: (HelixHeadlessDataTable["page"]) | undefined;
2026
2034
  /** How many rows a page holds. Zero is every row, which is what "no paging" means.
2027
2035
 
2028
2036
  **It announces nothing, and that is not an omission.** Nothing in this
@@ -2046,6 +2054,24 @@ nothing about the result. Ignored in `client` mode rather than trusted,
2046
2054
  because two sources for one count is the mistake, and here the array is the
2047
2055
  one that cannot be stale. */
2048
2056
  total?: (HelixHeadlessDataTable["total"]) | undefined;
2057
+ /** Draws the rows in view and stands empty space in for the rest.
2058
+
2059
+ **Not a `mode`.** `mode` says where the rows come from and who filtered
2060
+ them; this says how many of the ones we hold get drawn. They are
2061
+ independent: a consumer fetching five thousand rows a chunk at a time wants
2062
+ `mode="server"` and this at once, and folding this into `mode` would be an
2063
+ API that forbids that combination for no reason.
2064
+
2065
+ **Composes with `paginated` rather than excluding it.** A window over a
2066
+ page is coherent -- the page is the slice of the result, the window is the
2067
+ part of that slice on screen -- and the arithmetic is the same either way,
2068
+ so there is nothing to forbid. Together they suit a table paging at a
2069
+ thousand rows, where the page is a reasonable fetch and a poor render.
2070
+
2071
+ Off by default. Windowing costs a scroll listener, a measurement per row
2072
+ drawn, and a `block-size` on the scrolling box, and a table of twenty rows
2073
+ should pay none of them. */
2074
+ windowed?: (HelixHeadlessDataTable["windowed"]) | undefined;
2049
2075
  /** Whether to draw a pagination under the grid.
2050
2076
 
2051
2077
  On by default once a page size is set, because a paged table with no way to
@@ -7846,12 +7872,23 @@ export type HelixHeadlessVideoVueEvents = {
7846
7872
  };
7847
7873
 
7848
7874
  export type HelixHeadlessVirtualListVueProps = {
7849
- /** How tall one row is, in pixels, used to map scroll offset to an index. */
7875
+ /** How tall one row is, in pixels, used to map scroll offset to an index.
7876
+
7877
+ An estimate rather than a measurement while `measured` is off, which is
7878
+ right whenever the rows really are one height and is the cheaper of the two. */
7850
7879
  estimate?: (HelixHeadlessVirtualList["estimate"]) | undefined;
7851
7880
  /** Id of the element holding the rows, as JSON in a script. */
7852
7881
  for?: (HelixHeadlessVirtualList["for"]) | undefined;
7853
7882
  /** What the list is called, since the rendered rows are only a window on it. */
7854
7883
  label?: (HelixHeadlessVirtualList["label"]) | undefined;
7884
+ /** Places rows by what they came to rather than by `estimate`.
7885
+
7886
+ **Off by default, because the straight line is better when it holds.** One
7887
+ estimate makes offset and index convert by division, which can never
7888
+ disagree with itself; measuring is what a set of genuinely different
7889
+ heights needs and costs a read of each row as it renders. A list of
7890
+ one-line rows should leave this alone. */
7891
+ measured?: (HelixHeadlessVirtualList["measured"]) | undefined;
7855
7892
  };
7856
7893
 
7857
7894
  export type HelixHeadlessVirtualListVueEvents = {};