@sectile/virtual 0.5.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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/extent-index.d.ts +40 -0
  4. package/dist/extent-index.d.ts.map +1 -0
  5. package/dist/extent-index.js +388 -0
  6. package/dist/extent-index.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +2 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/internal/foundation.d.ts +6 -0
  12. package/dist/internal/foundation.d.ts.map +1 -0
  13. package/dist/internal/foundation.js +28 -0
  14. package/dist/internal/foundation.js.map +1 -0
  15. package/dist/internal/machine.d.ts +4 -0
  16. package/dist/internal/machine.d.ts.map +1 -0
  17. package/dist/internal/machine.js +8 -0
  18. package/dist/internal/machine.js.map +1 -0
  19. package/dist/internal/track.d.ts +14 -0
  20. package/dist/internal/track.d.ts.map +1 -0
  21. package/dist/internal/track.js +72 -0
  22. package/dist/internal/track.js.map +1 -0
  23. package/dist/layout.d.ts +72 -0
  24. package/dist/layout.d.ts.map +1 -0
  25. package/dist/layout.js +75 -0
  26. package/dist/layout.js.map +1 -0
  27. package/dist/linear-layout.d.ts +61 -0
  28. package/dist/linear-layout.d.ts.map +1 -0
  29. package/dist/linear-layout.js +192 -0
  30. package/dist/linear-layout.js.map +1 -0
  31. package/dist/masonry-layout.d.ts +66 -0
  32. package/dist/masonry-layout.d.ts.map +1 -0
  33. package/dist/masonry-layout.js +270 -0
  34. package/dist/masonry-layout.js.map +1 -0
  35. package/dist/spatial-layout.d.ts +48 -0
  36. package/dist/spatial-layout.d.ts.map +1 -0
  37. package/dist/spatial-layout.js +237 -0
  38. package/dist/spatial-layout.js.map +1 -0
  39. package/dist/track-grid-layout.d.ts +62 -0
  40. package/dist/track-grid-layout.d.ts.map +1 -0
  41. package/dist/track-grid-layout.js +263 -0
  42. package/dist/track-grid-layout.js.map +1 -0
  43. package/package.json +78 -0
@@ -0,0 +1,72 @@
1
+ export function extentValue(extent) {
2
+ return extent.kind === 'unknown' ? extent.fallback : extent.value;
3
+ }
4
+ export function trackContentExtent(index, gap) {
5
+ return index.totalExtent + gap * Math.max(0, index.size - 1);
6
+ }
7
+ export function trackRange(index, gap, flow, visualStart, visualEnd) {
8
+ const content = trackContentExtent(index, gap);
9
+ const start = flow === 'forward' ? visualStart : Math.max(0, content - visualEnd);
10
+ const end = flow === 'forward' ? visualEnd : Math.max(0, content - visualStart);
11
+ if (gap === 0)
12
+ return Object.freeze({ start: directRangeStart(index, start), end: directRangeEnd(index, end) });
13
+ return Object.freeze({ start: firstIntersecting(index, gap, start), end: firstStartingAtOrAfter(index, gap, end) });
14
+ }
15
+ export function trackSpan(index, gap, flow, start, span) {
16
+ if (!Number.isSafeInteger(start) || !Number.isSafeInteger(span) || start < 0 || span < 1 || start + span > index.size)
17
+ return null;
18
+ const offset = index.offsetAt(start);
19
+ const after = index.offsetAt(start + span);
20
+ if (offset === null || after === null)
21
+ return null;
22
+ const extent = after - offset + gap * (span - 1);
23
+ const logicalStart = offset + gap * start;
24
+ const visualStart = flow === 'forward' ? logicalStart : trackContentExtent(index, gap) - logicalStart - extent;
25
+ return Object.freeze({ start: visualStart, extent });
26
+ }
27
+ function firstIntersecting(index, gap, offset) {
28
+ let low = 0;
29
+ let high = index.size;
30
+ while (low < high) {
31
+ const middle = (low + high) >>> 1;
32
+ const start = (index.offsetAt(middle) ?? 0) + gap * middle;
33
+ const extent = index.extentAt(middle);
34
+ const value = extent === null ? 0 : extentValue(extent);
35
+ if (start + value <= offset)
36
+ low = middle + 1;
37
+ else
38
+ high = middle;
39
+ }
40
+ return low;
41
+ }
42
+ function directRangeStart(index, offset) {
43
+ if (offset <= 0)
44
+ return 0;
45
+ if (offset >= index.totalExtent)
46
+ return index.size;
47
+ return index.locateOffset(offset)?.index ?? index.size;
48
+ }
49
+ function directRangeEnd(index, offset) {
50
+ if (offset <= 0)
51
+ return 0;
52
+ if (offset >= index.totalExtent)
53
+ return index.size;
54
+ const location = index.locateOffset(offset);
55
+ if (location === null)
56
+ return index.size;
57
+ return location.offsetWithin === 0 ? location.index : location.index + 1;
58
+ }
59
+ function firstStartingAtOrAfter(index, gap, offset) {
60
+ let low = 0;
61
+ let high = index.size;
62
+ while (low < high) {
63
+ const middle = (low + high) >>> 1;
64
+ const start = (index.offsetAt(middle) ?? 0) + gap * middle;
65
+ if (start < offset)
66
+ low = middle + 1;
67
+ else
68
+ high = middle;
69
+ }
70
+ return low;
71
+ }
72
+ //# sourceMappingURL=track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/internal/track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { Result, StableID } from '@sectile/core';
2
+ export interface VirtualPoint {
3
+ readonly x: number;
4
+ readonly y: number;
5
+ }
6
+ export interface VirtualSize {
7
+ readonly width: number;
8
+ readonly height: number;
9
+ }
10
+ export interface VirtualRect extends VirtualPoint, VirtualSize {
11
+ }
12
+ export interface VirtualInsets {
13
+ readonly top: number;
14
+ readonly right: number;
15
+ readonly bottom: number;
16
+ readonly left: number;
17
+ }
18
+ export interface VirtualQueryInput {
19
+ readonly viewport: VirtualRect;
20
+ readonly overscan?: number | Partial<VirtualInsets>;
21
+ }
22
+ export interface VirtualPlacement<ID extends StableID = StableID> {
23
+ readonly id: ID;
24
+ readonly index: number;
25
+ readonly rect: VirtualRect;
26
+ readonly visible: boolean;
27
+ }
28
+ export interface VirtualAnchor<ID extends StableID = StableID> {
29
+ readonly id: ID;
30
+ readonly viewportOffset: VirtualPoint;
31
+ }
32
+ export interface VirtualLayoutPlan<ID extends StableID = StableID> {
33
+ readonly generation: number;
34
+ readonly contentSize: VirtualSize;
35
+ readonly viewport: VirtualRect;
36
+ readonly renderBounds: VirtualRect;
37
+ readonly placements: readonly VirtualPlacement<ID>[];
38
+ readonly anchor: VirtualAnchor<ID> | null;
39
+ }
40
+ export interface VirtualMeasurementBatch<Measurement, ID extends StableID = StableID> {
41
+ readonly generation: number;
42
+ readonly measurements: readonly Measurement[];
43
+ readonly anchor?: VirtualAnchor<ID> | null;
44
+ }
45
+ export interface VirtualMutationInput<Mutation, ID extends StableID = StableID> {
46
+ readonly mutation: Mutation;
47
+ readonly anchor?: VirtualAnchor<ID> | null;
48
+ }
49
+ export interface VirtualLayoutMutation<State> {
50
+ readonly state: State;
51
+ readonly scrollDelta: VirtualPoint;
52
+ }
53
+ export type VirtualScrollAlignment = 'start' | 'center' | 'end' | 'nearest';
54
+ export interface VirtualLayoutStrategy<State, ID extends StableID, Measurement, Mutation> {
55
+ readonly kind: string;
56
+ tryQuery(state: State, input: VirtualQueryInput): Result<VirtualLayoutPlan<ID>>;
57
+ tryMeasure(state: State, batch: VirtualMeasurementBatch<Measurement, ID>): Result<VirtualLayoutMutation<State>>;
58
+ tryMutate(state: State, input: VirtualMutationInput<Mutation, ID>): Result<VirtualLayoutMutation<State>>;
59
+ tryScrollTarget(state: State, id: ID, viewport: VirtualRect, alignment?: VirtualScrollAlignment): Result<VirtualPoint>;
60
+ }
61
+ export declare const ZERO_POINT: VirtualPoint;
62
+ export declare const ZERO_INSETS: VirtualInsets;
63
+ export declare function normalizeQuery(input: VirtualQueryInput): Result<{
64
+ readonly viewport: VirtualRect;
65
+ readonly overscan: VirtualInsets;
66
+ readonly renderBounds: VirtualRect;
67
+ }>;
68
+ export declare function rectanglesIntersect(left: VirtualRect, right: VirtualRect): boolean;
69
+ export declare function pointDelta(before: VirtualRect, after: VirtualRect): VirtualPoint;
70
+ export declare function anchorForPlan<ID extends StableID>(viewport: VirtualRect, placements: readonly VirtualPlacement<ID>[]): VirtualAnchor<ID> | null;
71
+ export declare function alignedScrollOffset(itemStart: number, itemExtent: number, viewportStart: number, viewportExtent: number, contentExtent: number, alignment: VirtualScrollAlignment): number;
72
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
package/dist/layout.js ADDED
@@ -0,0 +1,75 @@
1
+ export const ZERO_POINT = Object.freeze({ x: 0, y: 0 });
2
+ export const ZERO_INSETS = Object.freeze({ top: 0, right: 0, bottom: 0, left: 0 });
3
+ export function normalizeQuery(input) {
4
+ const viewport = freezeRect(input.viewport);
5
+ if (viewport === null)
6
+ return invalidGeometry('Viewport coordinates and extents must be finite and non-negative.', input.viewport);
7
+ const overscan = normalizeInsets(input.overscan);
8
+ if (overscan === null)
9
+ return invalidGeometry('Overscan must contain finite non-negative extents.', input.overscan);
10
+ const renderX = Math.max(0, viewport.x - overscan.left);
11
+ const renderY = Math.max(0, viewport.y - overscan.top);
12
+ return { ok: true, value: Object.freeze({
13
+ viewport,
14
+ overscan,
15
+ renderBounds: Object.freeze({
16
+ x: renderX,
17
+ y: renderY,
18
+ width: viewport.x + viewport.width + overscan.right - renderX,
19
+ height: viewport.y + viewport.height + overscan.bottom - renderY,
20
+ }),
21
+ }) };
22
+ }
23
+ export function rectanglesIntersect(left, right) {
24
+ return left.x < right.x + right.width && right.x < left.x + left.width
25
+ && left.y < right.y + right.height && right.y < left.y + left.height;
26
+ }
27
+ export function pointDelta(before, after) {
28
+ return Object.freeze({ x: after.x - before.x, y: after.y - before.y });
29
+ }
30
+ export function anchorForPlan(viewport, placements) {
31
+ let anchor = null;
32
+ for (const placement of placements) {
33
+ if (!placement.visible)
34
+ continue;
35
+ if (anchor === null || placement.rect.y < anchor.rect.y || (placement.rect.y === anchor.rect.y && placement.rect.x < anchor.rect.x))
36
+ anchor = placement;
37
+ }
38
+ return anchor === null ? null : Object.freeze({ id: anchor.id, viewportOffset: Object.freeze({ x: anchor.rect.x - viewport.x, y: anchor.rect.y - viewport.y }) });
39
+ }
40
+ export function alignedScrollOffset(itemStart, itemExtent, viewportStart, viewportExtent, contentExtent, alignment) {
41
+ const itemEnd = itemStart + itemExtent;
42
+ const viewportEnd = viewportStart + viewportExtent;
43
+ let target;
44
+ if (alignment === 'start')
45
+ target = itemStart;
46
+ else if (alignment === 'center')
47
+ target = itemStart - (viewportExtent - itemExtent) / 2;
48
+ else if (alignment === 'end')
49
+ target = itemEnd - viewportExtent;
50
+ else if (itemStart < viewportStart)
51
+ target = itemStart;
52
+ else if (itemEnd > viewportEnd)
53
+ target = itemEnd - viewportExtent;
54
+ else
55
+ target = viewportStart;
56
+ return Math.min(Math.max(0, target), Math.max(0, contentExtent - viewportExtent));
57
+ }
58
+ function freezeRect(value) {
59
+ if (value === null || typeof value !== 'object' || !Number.isFinite(value.x) || !Number.isFinite(value.y)
60
+ || !Number.isFinite(value.width) || !Number.isFinite(value.height) || value.x < 0 || value.y < 0 || value.width < 0 || value.height < 0)
61
+ return null;
62
+ return Object.freeze({ x: value.x, y: value.y, width: value.width, height: value.height });
63
+ }
64
+ function normalizeInsets(value) {
65
+ if (value === undefined)
66
+ return ZERO_INSETS;
67
+ if (typeof value === 'number')
68
+ return Number.isFinite(value) && value >= 0 ? Object.freeze({ top: value, right: value, bottom: value, left: value }) : null;
69
+ const result = { top: value.top ?? 0, right: value.right ?? 0, bottom: value.bottom ?? 0, left: value.left ?? 0 };
70
+ return Object.values(result).every((item) => Number.isFinite(item) && item >= 0) ? Object.freeze(result) : null;
71
+ }
72
+ function invalidGeometry(message, value) {
73
+ return { ok: false, error: { class: 'construction', code: 'virtual-layout-geometry-invalid', message, details: { value } } };
74
+ }
75
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { Result, StableID } from '@sectile/core';
2
+ import { type CollectionWindowEvent, type CollectionWindowState } from '@sectile/core/collection-window';
3
+ import { type Sequence, type SequencePatch } from '@sectile/core/sequence';
4
+ import type { Extent, ExtentIndex } from './extent-index.js';
5
+ import { type VirtualAnchor, type VirtualLayoutMutation, type VirtualLayoutPlan, type VirtualLayoutStrategy, type VirtualMeasurementBatch, type VirtualPoint, type VirtualQueryInput, type VirtualRect, type VirtualScrollAlignment } from './layout.js';
6
+ export type LinearAxis = 'vertical' | 'horizontal';
7
+ export type LinearFlow = 'forward' | 'reverse';
8
+ export interface LinearLayoutState<ID extends StableID = StableID> {
9
+ readonly domain: Sequence<ID>;
10
+ readonly extents: ExtentIndex;
11
+ readonly axis: LinearAxis;
12
+ readonly flow: LinearFlow;
13
+ readonly gap: number;
14
+ readonly crossOffset: number;
15
+ readonly crossExtent: number;
16
+ readonly generation: number;
17
+ }
18
+ export interface LinearLayoutInput {
19
+ readonly axis?: LinearAxis;
20
+ readonly flow?: LinearFlow;
21
+ readonly gap?: number;
22
+ readonly crossOffset?: number;
23
+ readonly crossExtent?: number;
24
+ }
25
+ export interface LinearMeasurement {
26
+ readonly index: number;
27
+ readonly extent: Extent;
28
+ }
29
+ export interface LinearPatch<ID extends StableID = StableID> {
30
+ readonly patch: SequencePatch<ID>;
31
+ readonly insertedExtents?: readonly Extent[];
32
+ }
33
+ export interface LinearLayoutWindow {
34
+ readonly generation: number;
35
+ readonly contentSize: {
36
+ readonly width: number;
37
+ readonly height: number;
38
+ };
39
+ readonly viewport: VirtualRect;
40
+ readonly renderBounds: VirtualRect;
41
+ readonly renderStart: number;
42
+ readonly renderEnd: number;
43
+ readonly visibleStart: number;
44
+ readonly visibleEnd: number;
45
+ }
46
+ export declare const linearLayoutStrategy: VirtualLayoutStrategy<LinearLayoutState, StableID, LinearMeasurement, LinearPatch>;
47
+ export declare function createLinearLayout<ID extends StableID>(domain: Sequence<ID>, extents: ExtentIndex, input?: LinearLayoutInput): LinearLayoutState<ID>;
48
+ export declare function tryCreateLinearLayout<ID extends StableID>(domain: Sequence<ID>, extents: ExtentIndex, input?: LinearLayoutInput): Result<LinearLayoutState<ID>>;
49
+ export declare function queryLinearLayout<ID extends StableID>(state: LinearLayoutState<ID>, input: VirtualQueryInput): VirtualLayoutPlan<ID>;
50
+ export declare function tryQueryLinearLayout<ID extends StableID>(state: LinearLayoutState<ID>, input: VirtualQueryInput): Result<VirtualLayoutPlan<ID>>;
51
+ export declare function queryLinearWindow<ID extends StableID>(state: LinearLayoutState<ID>, input: VirtualQueryInput): LinearLayoutWindow;
52
+ export declare function tryQueryLinearWindow<ID extends StableID>(state: LinearLayoutState<ID>, input: VirtualQueryInput): Result<LinearLayoutWindow>;
53
+ export declare function applyLinearMeasurements<ID extends StableID>(state: LinearLayoutState<ID>, batch: VirtualMeasurementBatch<LinearMeasurement, ID>): VirtualLayoutMutation<LinearLayoutState<ID>>;
54
+ export declare function tryApplyLinearMeasurements<ID extends StableID>(state: LinearLayoutState<ID>, batch: VirtualMeasurementBatch<LinearMeasurement, ID>): Result<VirtualLayoutMutation<LinearLayoutState<ID>>>;
55
+ export declare function applyLinearPatch<ID extends StableID>(state: LinearLayoutState<ID>, input: LinearPatch<ID>, anchor?: VirtualAnchor<ID> | null): VirtualLayoutMutation<LinearLayoutState<ID>>;
56
+ export declare function tryApplyLinearPatch<ID extends StableID>(state: LinearLayoutState<ID>, input: LinearPatch<ID>, anchor?: VirtualAnchor<ID> | null): Result<VirtualLayoutMutation<LinearLayoutState<ID>>>;
57
+ export declare function linearScrollTarget<ID extends StableID>(state: LinearLayoutState<ID>, id: ID, viewport: VirtualRect, alignment?: VirtualScrollAlignment): VirtualPoint;
58
+ export declare function tryLinearScrollTarget<ID extends StableID>(state: LinearLayoutState<ID>, id: ID, viewport: VirtualRect, alignment?: VirtualScrollAlignment): Result<VirtualPoint>;
59
+ export declare function linearRectAt<ID extends StableID>(state: LinearLayoutState<ID>, index: number): VirtualRect | null;
60
+ export declare function collectionWindowEventForLinearPlan<ID extends StableID>(plan: VirtualLayoutPlan<ID>, collection: CollectionWindowState<ID>, loadedDomain: Sequence<ID>): Result<CollectionWindowEvent<ID> | null>;
61
+ //# sourceMappingURL=linear-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-layout.d.ts","sourceRoot":"","sources":["../src/linear-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ import { canRequestCollectionWindow } from '@sectile/core/collection-window';
2
+ import { tryApplySequencePatch } from '@sectile/core/sequence';
3
+ import { unwrap } from '@sectile/core/result';
4
+ import { fail, ok } from './internal/foundation.js';
5
+ import { trackContentExtent, trackRange, trackSpan } from './internal/track.js';
6
+ import { alignedScrollOffset, anchorForPlan, normalizeQuery, pointDelta, rectanglesIntersect, ZERO_POINT, } from './layout.js';
7
+ export const linearLayoutStrategy = Object.freeze({
8
+ kind: 'linear',
9
+ tryQuery: (state, input) => tryQueryLinearLayout(state, input),
10
+ tryMeasure: (state, batch) => tryApplyLinearMeasurements(state, batch),
11
+ tryMutate: (state, input) => tryApplyLinearPatch(state, input.mutation, input.anchor),
12
+ tryScrollTarget: (state, id, viewport, alignment) => tryLinearScrollTarget(state, id, viewport, alignment),
13
+ });
14
+ export function createLinearLayout(domain, extents, input = {}) {
15
+ return unwrap(tryCreateLinearLayout(domain, extents, input));
16
+ }
17
+ export function tryCreateLinearLayout(domain, extents, input = {}) {
18
+ if (domain.size !== extents.size)
19
+ return fail('construction', 'virtual-layout-domain-mismatch', 'Linear domain and extent index must have the same size.', { domainSize: domain.size, extentSize: extents.size });
20
+ const axis = input.axis ?? 'vertical';
21
+ const flow = input.flow ?? 'forward';
22
+ const gap = input.gap ?? 0;
23
+ const crossOffset = input.crossOffset ?? 0;
24
+ const crossExtent = input.crossExtent ?? 0;
25
+ if ((axis !== 'vertical' && axis !== 'horizontal') || (flow !== 'forward' && flow !== 'reverse')
26
+ || !finiteNonNegative(gap) || !finiteNonNegative(crossOffset) || !finiteNonNegative(crossExtent)) {
27
+ return geometryFailure('Linear axis, flow, gap, and cross geometry are invalid.');
28
+ }
29
+ return ok(freezeState({ domain, extents, axis, flow, gap, crossOffset, crossExtent, generation: 0 }));
30
+ }
31
+ export function queryLinearLayout(state, input) {
32
+ return unwrap(tryQueryLinearLayout(state, input));
33
+ }
34
+ export function tryQueryLinearLayout(state, input) {
35
+ const window = tryQueryLinearWindow(state, input);
36
+ if (!window.ok)
37
+ return window;
38
+ const { viewport, renderBounds } = window.value;
39
+ const placements = [];
40
+ const extents = state.extents.slice(window.value.renderStart, window.value.renderEnd);
41
+ if (extents === null)
42
+ return fail('construction', 'virtual-layout-domain-mismatch', 'Linear render range must belong to the extent domain.');
43
+ let logicalStart = (state.extents.offsetAt(window.value.renderStart) ?? 0) + state.gap * window.value.renderStart;
44
+ for (let local = 0; local < extents.length; local += 1) {
45
+ const index = window.value.renderStart + local;
46
+ const id = state.domain.at(index);
47
+ const extent = extents[local];
48
+ const value = extent.kind === 'unknown' ? extent.fallback : extent.value;
49
+ const visualStart = state.flow === 'forward' ? logicalStart : mainContentExtent(state) - logicalStart - value;
50
+ const rect = state.axis === 'vertical'
51
+ ? Object.freeze({ x: state.crossOffset, y: visualStart, width: state.crossExtent, height: value })
52
+ : Object.freeze({ x: visualStart, y: state.crossOffset, width: value, height: state.crossExtent });
53
+ logicalStart += value + state.gap;
54
+ if (id === null || !rectanglesIntersect(rect, renderBounds))
55
+ continue;
56
+ placements.push(Object.freeze({ id, index, rect, visible: rectanglesIntersect(rect, viewport) }));
57
+ }
58
+ const frozen = Object.freeze(placements);
59
+ return ok(Object.freeze({ generation: state.generation, contentSize: window.value.contentSize, viewport, renderBounds, placements: frozen, anchor: anchorForPlan(viewport, frozen) }));
60
+ }
61
+ export function queryLinearWindow(state, input) {
62
+ return unwrap(tryQueryLinearWindow(state, input));
63
+ }
64
+ export function tryQueryLinearWindow(state, input) {
65
+ const normalized = normalizeQuery(input);
66
+ if (!normalized.ok)
67
+ return normalized;
68
+ const range = (bounds) => {
69
+ const start = mainStart(state.axis, bounds);
70
+ return trackRange(state.extents, state.gap, state.flow, start, start + mainExtent(state.axis, bounds));
71
+ };
72
+ const render = range(normalized.value.renderBounds);
73
+ const visible = range(normalized.value.viewport);
74
+ return ok(Object.freeze({
75
+ generation: state.generation,
76
+ contentSize: sizeOf(state),
77
+ viewport: normalized.value.viewport,
78
+ renderBounds: normalized.value.renderBounds,
79
+ renderStart: render.start,
80
+ renderEnd: render.end,
81
+ visibleStart: visible.start,
82
+ visibleEnd: visible.end,
83
+ }));
84
+ }
85
+ export function applyLinearMeasurements(state, batch) {
86
+ return unwrap(tryApplyLinearMeasurements(state, batch));
87
+ }
88
+ export function tryApplyLinearMeasurements(state, batch) {
89
+ if (batch.generation !== state.generation)
90
+ return fail('transition-rejection', 'virtual-layout-measurement-stale', 'Measurement generation is stale.', { generation: batch.generation, activeGeneration: state.generation });
91
+ if (batch.measurements.length === 0)
92
+ return ok(Object.freeze({ state, scrollDelta: ZERO_POINT }));
93
+ const generation = nextGeneration(state.generation);
94
+ if (!generation.ok)
95
+ return generation;
96
+ const before = anchorRect(state, batch.anchor);
97
+ const updated = state.extents.update(batch.measurements);
98
+ if (!updated.ok)
99
+ return updated;
100
+ const next = freezeState({ ...state, extents: updated.value, generation: generation.value });
101
+ return ok(Object.freeze({ state: next, scrollDelta: anchorDelta(before, anchorRect(next, batch.anchor)) }));
102
+ }
103
+ export function applyLinearPatch(state, input, anchor = null) {
104
+ return unwrap(tryApplyLinearPatch(state, input, anchor));
105
+ }
106
+ export function tryApplyLinearPatch(state, input, anchor = null) {
107
+ const inserted = input.insertedExtents ?? [];
108
+ if (input.patch.type === 'splice' && inserted.length !== input.patch.inserted.length)
109
+ return fail('transition-rejection', 'virtual-layout-inserted-extents-mismatch', 'Every inserted identity requires one extent.');
110
+ if (input.patch.type === 'move' && inserted.length !== 0)
111
+ return fail('transition-rejection', 'virtual-layout-inserted-extents-mismatch', 'Move patches cannot insert extents.');
112
+ const domain = tryApplySequencePatch(state.domain, input.patch, { maxItems: Math.max(1, state.domain.size - (input.patch.type === 'splice' ? input.patch.deleteCount : 0) + inserted.length) });
113
+ if (!domain.ok)
114
+ return domain;
115
+ const extents = input.patch.type === 'splice'
116
+ ? state.extents.splice(input.patch.index, input.patch.deleteCount, inserted)
117
+ : state.extents.move(input.patch.from, input.patch.to, input.patch.count);
118
+ if (!extents.ok)
119
+ return extents;
120
+ const generation = nextGeneration(state.generation);
121
+ if (!generation.ok)
122
+ return generation;
123
+ const before = anchorRect(state, anchor);
124
+ const next = freezeState({ ...state, domain: domain.value, extents: extents.value, generation: generation.value });
125
+ return ok(Object.freeze({ state: next, scrollDelta: anchorDelta(before, anchorRect(next, anchor)) }));
126
+ }
127
+ export function linearScrollTarget(state, id, viewport, alignment = 'nearest') {
128
+ return unwrap(tryLinearScrollTarget(state, id, viewport, alignment));
129
+ }
130
+ export function tryLinearScrollTarget(state, id, viewport, alignment = 'nearest') {
131
+ const index = state.domain.indexOf(id);
132
+ const rect = index === null ? null : rectAt(state, index);
133
+ if (rect === null)
134
+ return fail('transition-rejection', 'virtual-layout-scroll-target-invalid', 'Scroll target must exist in the linear domain.', { id });
135
+ const content = sizeOf(state);
136
+ return ok(Object.freeze(state.axis === 'vertical'
137
+ ? { x: viewport.x, y: alignedScrollOffset(rect.y, rect.height, viewport.y, viewport.height, content.height, alignment) }
138
+ : { x: alignedScrollOffset(rect.x, rect.width, viewport.x, viewport.width, content.width, alignment), y: viewport.y }));
139
+ }
140
+ export function linearRectAt(state, index) {
141
+ return rectAt(state, index);
142
+ }
143
+ export function collectionWindowEventForLinearPlan(plan, collection, loadedDomain) {
144
+ if (loadedDomain.size !== collection.size)
145
+ return fail('transition-rejection', 'virtual-layout-window-mismatch', 'Loaded identity domain must match the collection window size.');
146
+ if (collection.pending !== null || plan.placements.length === 0)
147
+ return ok(null);
148
+ let renderStart = Number.MAX_SAFE_INTEGER;
149
+ let renderEnd = 0;
150
+ let visibleStart = Number.MAX_SAFE_INTEGER;
151
+ for (const placement of plan.placements) {
152
+ renderStart = Math.min(renderStart, placement.index);
153
+ renderEnd = Math.max(renderEnd, placement.index + 1);
154
+ if (placement.visible)
155
+ visibleStart = Math.min(visibleStart, placement.index);
156
+ }
157
+ const loadedEnd = collection.start + collection.size;
158
+ const needsBefore = renderStart < collection.start;
159
+ const needsAfter = renderEnd > loadedEnd;
160
+ const direction = visibleStart < collection.start || (needsBefore && !needsAfter) ? 'before' : needsAfter ? 'after' : null;
161
+ if (direction === null || !canRequestCollectionWindow(collection, direction))
162
+ return ok(null);
163
+ const anchor = direction === 'before' ? loadedDomain.at(0) : loadedDomain.at(loadedDomain.size - 1);
164
+ return ok({ type: 'request-window', direction, anchor });
165
+ }
166
+ function rectAt(state, index) {
167
+ const span = trackSpan(state.extents, state.gap, state.flow, index, 1);
168
+ if (span === null)
169
+ return null;
170
+ return state.axis === 'vertical'
171
+ ? Object.freeze({ x: state.crossOffset, y: span.start, width: state.crossExtent, height: span.extent })
172
+ : Object.freeze({ x: span.start, y: state.crossOffset, width: span.extent, height: state.crossExtent });
173
+ }
174
+ function anchorRect(state, anchor) {
175
+ if (anchor === null || anchor === undefined)
176
+ return null;
177
+ const index = state.domain.indexOf(anchor.id);
178
+ return index === null ? null : rectAt(state, index);
179
+ }
180
+ function anchorDelta(before, after) { return before === null || after === null ? ZERO_POINT : pointDelta(before, after); }
181
+ function mainContentExtent(state) { return trackContentExtent(state.extents, state.gap); }
182
+ function sizeOf(state) {
183
+ const main = mainContentExtent(state);
184
+ return Object.freeze(state.axis === 'vertical' ? { width: state.crossOffset + state.crossExtent, height: main } : { width: main, height: state.crossOffset + state.crossExtent });
185
+ }
186
+ function mainStart(axis, rect) { return axis === 'vertical' ? rect.y : rect.x; }
187
+ function mainExtent(axis, rect) { return axis === 'vertical' ? rect.height : rect.width; }
188
+ function nextGeneration(generation) { return generation === Number.MAX_SAFE_INTEGER ? fail('resource-rejection', 'virtual-layout-generation-exhausted', 'Layout generation reached the safe-integer ceiling.') : ok(generation + 1); }
189
+ function freezeState(state) { return Object.freeze(state); }
190
+ function finiteNonNegative(value) { return Number.isFinite(value) && value >= 0; }
191
+ function geometryFailure(message) { return fail('construction', 'virtual-layout-geometry-invalid', message); }
192
+ //# sourceMappingURL=linear-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-layout.js","sourceRoot":"","sources":["../src/linear-layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAA0D,MAAM,iCAAiC,CAAC;AACrI,OAAO,EAAE,qBAAqB,EAAqC,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EACL,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAIhG,MAAM,aAAa,CAAC;AA6BrB,MAAM,CAAC,MAAM,oBAAoB,GAAuF,MAAM,CAAC,MAAM,CAAC;IACpI,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,KAAwB,EAAE,KAAwB,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC;IACpG,UAAU,EAAE,CAAC,KAAwB,EAAE,KAAiD,EAAE,EAAE,CAAC,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC;IACrI,SAAS,EAAE,CAAC,KAAwB,EAAE,KAAiF,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;IACpL,eAAe,EAAE,CAAC,KAAwB,EAAE,EAAY,EAAE,QAAqB,EAAE,SAAkC,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;CAC9K,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAsB,MAAoB,EAAE,OAAoB,EAAE,KAAK,GAAsB,EAAE;IAC/H,OAAO,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAsB,MAAoB,EAAE,OAAoB,EAAE,KAAK,GAAsB,EAAE;IAClI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,cAAc,EAAE,gCAAgC,EAAE,yDAAyD,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClN,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC;WAC3F,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QACnG,OAAO,eAAe,CAAC,yDAAyD,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAsB,KAA4B,EAAE,KAAwB;IAC3G,OAAO,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAsB,KAA4B,EAAE,KAAwB;IAC9G,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAChD,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACtF,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,cAAc,EAAE,gCAAgC,EAAE,uDAAuD,CAAC,CAAC;IAC7I,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;IAClH,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;QAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACzE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,KAAK,CAAC;QAC9G,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU;YACpC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAClG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACrG,YAAY,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;QAClC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC;YAAE,SAAS;QACtE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACzL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAsB,KAA4B,EAAE,KAAwB;IAC3G,OAAO,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAsB,KAA4B,EAAE,KAAwB;IAC9G,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,MAAmB,EAAoD,EAAE;QACtF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACzG,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;QAC1B,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ;QACnC,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC,YAAY;QAC3C,WAAW,EAAE,MAAM,CAAC,KAAK;QACzB,SAAS,EAAE,MAAM,CAAC,GAAG;QACrB,YAAY,EAAE,OAAO,CAAC,KAAK;QAC3B,UAAU,EAAE,OAAO,CAAC,GAAG;KACxB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAsB,KAA4B,EAAE,KAAqD;IAC9I,OAAO,MAAM,CAAC,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAsB,KAA4B,EAAE,KAAqD;IACjJ,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,kCAAkC,EAAE,kCAAkC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7N,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAuC,CAAC,CAAC;IACpF,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7F,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAsB,KAA4B,EAAE,KAAsB,EAAE,MAAM,GAA6B,IAAI;IACjJ,OAAO,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAsB,KAA4B,EAAE,KAAsB,EAAE,MAAM,GAA6B,IAAI;IACpJ,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,0CAA0C,EAAE,8CAA8C,CAAC,CAAC;IACtN,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,0CAA0C,EAAE,qCAAqC,CAAC,CAAC;IACjL,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChM,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC3C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC5E,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IACnH,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAsB,KAA4B,EAAE,EAAM,EAAE,QAAqB,EAAE,SAAS,GAA2B,SAAS;IAChK,OAAO,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAsB,KAA4B,EAAE,EAAM,EAAE,QAAqB,EAAE,SAAS,GAA2B,SAAS;IACnK,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,sCAAsC,EAAE,gDAAgD,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzJ,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;QAC/C,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;QACxH,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5H,CAAC;AAED,MAAM,UAAU,YAAY,CAAsB,KAA4B,EAAE,KAAa;IAC3F,OAAO,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,IAA2B,EAC3B,UAAqC,EACrC,YAA0B;IAE1B,IAAI,YAAY,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,gCAAgC,EAAE,+DAA+D,CAAC,CAAC;IAClL,IAAI,UAAU,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACjF,IAAI,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC1C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC3C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACrD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,SAAS,CAAC,OAAO;YAAE,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;IACrD,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;IACnD,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3H,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACpG,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CAAsB,KAA4B,EAAE,KAAa;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU;QAC9B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACvG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,UAAU,CAAsB,KAA4B,EAAE,MAA4C;IACjH,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,MAA0B,EAAE,KAAyB,IAAkB,OAAO,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAChL,SAAS,iBAAiB,CAAsB,KAA4B,IAAY,OAAO,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9I,SAAS,MAAM,CAAsB,KAA4B;IAC/D,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACpL,CAAC;AACD,SAAS,SAAS,CAAC,IAAgB,EAAE,IAAiB,IAAY,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjH,SAAS,UAAU,CAAC,IAAgB,EAAE,IAAiB,IAAY,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3H,SAAS,cAAc,CAAC,UAAkB,IAAoB,OAAO,UAAU,KAAK,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,qCAAqC,EAAE,qDAAqD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9P,SAAS,WAAW,CAAsB,KAA4B,IAA2B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/H,SAAS,iBAAiB,CAAC,KAAa,IAAa,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACnG,SAAS,eAAe,CAAI,OAAe,IAAe,OAAO,IAAI,CAAC,cAAc,EAAE,iCAAiC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import type { Result, StableID } from '@sectile/core';
2
+ import { type Sequence, type SequencePatch } from '@sectile/core/sequence';
3
+ import type { Extent, ExtentIndex } from './extent-index.js';
4
+ import type { LinearAxis, LinearFlow } from './linear-layout.js';
5
+ import { type VirtualAnchor, type VirtualLayoutMutation, type VirtualLayoutPlan, type VirtualLayoutStrategy, type VirtualMeasurementBatch, type VirtualPlacement, type VirtualPoint, type VirtualQueryInput, type VirtualRect, type VirtualScrollAlignment } from './layout.js';
6
+ export type MasonryPlacementPolicy = 'shortest' | 'round-robin';
7
+ export interface MasonryLayoutState<ID extends StableID = StableID> {
8
+ readonly domain: Sequence<ID>;
9
+ readonly extents: ExtentIndex;
10
+ readonly axis: LinearAxis;
11
+ readonly flow: LinearFlow;
12
+ readonly laneCount: number;
13
+ readonly laneExtent: number;
14
+ readonly laneGap: number;
15
+ readonly itemGap: number;
16
+ readonly placementPolicy: MasonryPlacementPolicy;
17
+ readonly maxLanes: number;
18
+ readonly generation: number;
19
+ }
20
+ export interface MasonryLayoutInput {
21
+ readonly axis?: LinearAxis;
22
+ readonly flow?: LinearFlow;
23
+ readonly laneCount: number;
24
+ readonly laneExtent: number;
25
+ readonly laneGap?: number;
26
+ readonly itemGap?: number;
27
+ readonly placementPolicy?: MasonryPlacementPolicy;
28
+ readonly maxLanes?: number;
29
+ }
30
+ export interface MasonryMeasurement {
31
+ readonly index: number;
32
+ readonly extent: Extent;
33
+ }
34
+ export type MasonryMutation<ID extends StableID = StableID> = {
35
+ readonly type: 'items';
36
+ readonly patch: SequencePatch<ID>;
37
+ readonly insertedExtents?: readonly Extent[];
38
+ } | {
39
+ readonly type: 'geometry';
40
+ readonly laneCount?: number;
41
+ readonly laneExtent?: number;
42
+ readonly laneGap?: number;
43
+ readonly itemGap?: number;
44
+ readonly axis?: LinearAxis;
45
+ readonly flow?: LinearFlow;
46
+ readonly placementPolicy?: MasonryPlacementPolicy;
47
+ };
48
+ export interface MasonryPlacement<ID extends StableID = StableID> extends VirtualPlacement<ID> {
49
+ readonly lane: number;
50
+ }
51
+ export interface MasonryLayoutPlan<ID extends StableID = StableID> extends VirtualLayoutPlan<ID> {
52
+ readonly placements: readonly MasonryPlacement<ID>[];
53
+ }
54
+ export declare const masonryLayoutStrategy: VirtualLayoutStrategy<MasonryLayoutState, StableID, MasonryMeasurement, MasonryMutation>;
55
+ export declare function createMasonryLayout<ID extends StableID>(domain: Sequence<ID>, extents: ExtentIndex, input: MasonryLayoutInput): MasonryLayoutState<ID>;
56
+ export declare function tryCreateMasonryLayout<ID extends StableID>(domain: Sequence<ID>, extents: ExtentIndex, input: MasonryLayoutInput): Result<MasonryLayoutState<ID>>;
57
+ export declare function queryMasonryLayout<ID extends StableID>(state: MasonryLayoutState<ID>, input: VirtualQueryInput): MasonryLayoutPlan<ID>;
58
+ export declare function tryQueryMasonryLayout<ID extends StableID>(state: MasonryLayoutState<ID>, input: VirtualQueryInput): Result<MasonryLayoutPlan<ID>>;
59
+ export declare function applyMasonryMeasurements<ID extends StableID>(state: MasonryLayoutState<ID>, batch: VirtualMeasurementBatch<MasonryMeasurement, ID>): VirtualLayoutMutation<MasonryLayoutState<ID>>;
60
+ export declare function tryApplyMasonryMeasurements<ID extends StableID>(state: MasonryLayoutState<ID>, batch: VirtualMeasurementBatch<MasonryMeasurement, ID>): Result<VirtualLayoutMutation<MasonryLayoutState<ID>>>;
61
+ export declare function applyMasonryMutation<ID extends StableID>(state: MasonryLayoutState<ID>, mutation: MasonryMutation<ID>, anchor?: VirtualAnchor<ID> | null): VirtualLayoutMutation<MasonryLayoutState<ID>>;
62
+ export declare function tryApplyMasonryMutation<ID extends StableID>(state: MasonryLayoutState<ID>, mutation: MasonryMutation<ID>, anchor?: VirtualAnchor<ID> | null): Result<VirtualLayoutMutation<MasonryLayoutState<ID>>>;
63
+ export declare function masonryScrollTarget<ID extends StableID>(state: MasonryLayoutState<ID>, id: ID, viewport: VirtualRect, alignment?: VirtualScrollAlignment): VirtualPoint;
64
+ export declare function tryMasonryScrollTarget<ID extends StableID>(state: MasonryLayoutState<ID>, id: ID, viewport: VirtualRect, alignment?: VirtualScrollAlignment): Result<VirtualPoint>;
65
+ export declare function masonryRectAt<ID extends StableID>(state: MasonryLayoutState<ID>, id: ID): VirtualRect | null;
66
+ //# sourceMappingURL=masonry-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masonry-layout.d.ts","sourceRoot":"","sources":["../src/masonry-layout.ts"],"names":[],"mappings":"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"}