@ankhorage/zora 25.4.0 → 25.6.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 (100) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +3 -1
  3. package/dist/features/grid-view/adapters/inbound/GridView.d.ts +2 -7
  4. package/dist/features/grid-view/adapters/inbound/GridView.d.ts.map +1 -1
  5. package/dist/features/grid-view/adapters/inbound/GridView.js +309 -51
  6. package/dist/features/grid-view/adapters/inbound/GridView.js.map +1 -1
  7. package/dist/features/grid-view/adapters/inbound/TileGrid.d.ts +1 -1
  8. package/dist/features/grid-view/adapters/inbound/TileGrid.d.ts.map +1 -1
  9. package/dist/features/grid-view/adapters/inbound/TileGrid.js +11 -4
  10. package/dist/features/grid-view/adapters/inbound/TileGrid.js.map +1 -1
  11. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.d.ts.map +1 -1
  12. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js +2 -0
  13. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js.map +1 -1
  14. package/dist/features/registry/componentMeta.d.ts.map +1 -1
  15. package/dist/features/registry/componentMeta.js +2 -0
  16. package/dist/features/registry/componentMeta.js.map +1 -1
  17. package/dist/features/time-grid/adapters/inbound/TimeGrid.d.ts +5 -0
  18. package/dist/features/time-grid/adapters/inbound/TimeGrid.d.ts.map +1 -0
  19. package/dist/features/time-grid/adapters/inbound/TimeGrid.js +107 -0
  20. package/dist/features/time-grid/adapters/inbound/TimeGrid.js.map +1 -0
  21. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.d.ts +9 -0
  22. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.d.ts.map +1 -0
  23. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.js +5 -0
  24. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.js.map +1 -0
  25. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.native.d.ts +9 -0
  26. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.native.d.ts.map +1 -0
  27. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.native.js +5 -0
  28. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.native.js.map +1 -0
  29. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.web.d.ts +9 -0
  30. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.web.d.ts.map +1 -0
  31. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.web.js +10 -0
  32. package/dist/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.web.js.map +1 -0
  33. package/dist/features/time-grid/application/resolveTimeGridNextFocusId.d.ts +4 -0
  34. package/dist/features/time-grid/application/resolveTimeGridNextFocusId.d.ts.map +1 -0
  35. package/dist/features/time-grid/application/resolveTimeGridNextFocusId.js +31 -0
  36. package/dist/features/time-grid/application/resolveTimeGridNextFocusId.js.map +1 -0
  37. package/dist/features/time-grid/application/resolveTimeGridVisibleIntervals.d.ts +5 -0
  38. package/dist/features/time-grid/application/resolveTimeGridVisibleIntervals.d.ts.map +1 -0
  39. package/dist/features/time-grid/application/resolveTimeGridVisibleIntervals.js +6 -0
  40. package/dist/features/time-grid/application/resolveTimeGridVisibleIntervals.js.map +1 -0
  41. package/dist/features/time-grid/meta.d.ts +11 -0
  42. package/dist/features/time-grid/meta.d.ts.map +1 -0
  43. package/dist/features/time-grid/meta.js +11 -0
  44. package/dist/features/time-grid/meta.js.map +1 -0
  45. package/dist/features/time-grid/public.d.ts +5 -0
  46. package/dist/features/time-grid/public.d.ts.map +1 -0
  47. package/dist/features/time-grid/public.js +4 -0
  48. package/dist/features/time-grid/public.js.map +1 -0
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/types/grid-view.d.ts +18 -1
  54. package/dist/types/grid-view.d.ts.map +1 -1
  55. package/dist/types/grid-view.js.map +1 -1
  56. package/dist/types/time-grid.d.ts +30 -0
  57. package/dist/types/time-grid.d.ts.map +1 -0
  58. package/dist/types/time-grid.js +2 -0
  59. package/dist/types/time-grid.js.map +1 -0
  60. package/package.json +1 -1
  61. package/src/features/grid-view/adapters/inbound/GridView.interaction.test.tsx +585 -0
  62. package/src/features/grid-view/adapters/inbound/GridView.test.tsx +74 -0
  63. package/src/features/grid-view/adapters/inbound/GridView.tsx +506 -77
  64. package/src/features/grid-view/adapters/inbound/TileGrid.tsx +26 -3
  65. package/src/features/registry/ZORA_COMPONENT_REGISTRY.ts +2 -0
  66. package/src/features/registry/componentMeta.ts +2 -0
  67. package/src/features/time-grid/adapters/inbound/TimeGrid.test.tsx +158 -0
  68. package/src/features/time-grid/adapters/inbound/TimeGrid.tsx +197 -0
  69. package/src/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.native.tsx +11 -0
  70. package/src/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.tsx +11 -0
  71. package/src/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.web.tsx +20 -0
  72. package/src/features/time-grid/application/resolveTimeGridNextFocusId.test.ts +46 -0
  73. package/src/features/time-grid/application/resolveTimeGridNextFocusId.ts +41 -0
  74. package/src/features/time-grid/application/resolveTimeGridVisibleIntervals.test.ts +33 -0
  75. package/src/features/time-grid/application/resolveTimeGridVisibleIntervals.ts +13 -0
  76. package/src/features/time-grid/meta.ts +12 -0
  77. package/src/features/time-grid/public.ts +4 -0
  78. package/src/index.ts +2 -0
  79. package/src/types/grid-view.ts +27 -1
  80. package/src/types/time-grid.ts +33 -0
  81. package/web-dist/chunks/{Accordion-r2w86rwv.js → Accordion-ebghcyzj.js} +125 -1
  82. package/web-dist/chunks/{Accordion-s3d6g59s.js → Accordion-f43jba23.js} +1 -1
  83. package/web-dist/chunks/Accordion-q8exgc3h.js +515 -0
  84. package/web-dist/chunks/{Accordion-60wn9xn9.js → Accordion-szar8dt5.js} +1 -1
  85. package/web-dist/components/explorer/Explorer.js +2 -2
  86. package/web-dist/components/file-explorer/FileExplorer.js +2 -2
  87. package/web-dist/components/grid-line-overlay/GridLineOverlay.js +1 -1
  88. package/web-dist/components/grid-ruler/GridRuler.js +1 -1
  89. package/web-dist/components/grid-view/GridView.js +1 -1
  90. package/web-dist/components/media-explorer/MediaExplorer.js +2 -2
  91. package/web-dist/components/reader/Reader.js +1 -1
  92. package/web-dist/components/spatial-grid/SpatialGrid.js +1 -1
  93. package/web-dist/components/tile-grid/TileGrid.js +1 -1
  94. package/web-dist/components/time-grid/TimeGrid.d.ts +3 -0
  95. package/web-dist/components/time-grid/TimeGrid.js +208 -0
  96. package/web-dist/components/time-grid/index.d.ts +1 -0
  97. package/web-dist/components/time-grid/index.js +2 -0
  98. package/web-dist/components/uploader/Uploader.js +2 -2
  99. package/web-dist/manifest.json +38 -22
  100. package/web-dist/chunks/Accordion-nxsda1my.js +0 -194
@@ -1,4 +1,9 @@
1
- import type { GridRectItem, GridViewport } from '@ankhorage/grid-view';
1
+ import type {
2
+ GridRectItem,
3
+ GridViewport,
4
+ GridViewportConstraints,
5
+ GridZoomLimits,
6
+ } from '@ankhorage/grid-view';
2
7
  import type React from 'react';
3
8
 
4
9
  import type { ZoraBaseProps } from './base';
@@ -10,6 +15,20 @@ export interface GridViewProps extends ZoraBaseProps {
10
15
  contentHeight: number;
11
16
  width: number;
12
17
  height: number;
18
+ /**
19
+ * Canonical controlled world viewport. Supplying this value makes `onViewportChange`
20
+ * report interaction proposals without mutating renderer-owned state.
21
+ */
22
+ viewport?: GridViewport;
23
+ /** Initial world position and independent axis scales for uncontrolled rendering. */
24
+ defaultViewport?: Partial<
25
+ Pick<GridViewport, 'offsetX' | 'offsetY' | 'pixelsPerUnitX' | 'pixelsPerUnitY'>
26
+ >;
27
+ /** Finite world bounds and optional overscroll for panning and focused-item reveal. */
28
+ viewportConstraints?: GridViewportConstraints;
29
+ /** Independent X/Y scale limits applied to focal-point zoom interactions. */
30
+ zoomLimits?: GridZoomLimits;
31
+ /** @deprecated Use `defaultViewport` for new code. */
13
32
  zoom?: number;
14
33
  overscanPixels?: number;
15
34
  /** Stable item identity that must be scrolled into view without duplicating viewport geometry. */
@@ -34,11 +53,18 @@ export interface TileGridProps extends ZoraBaseProps {
34
53
  tileSize?: number;
35
54
  gap?: number;
36
55
  zoom?: number;
56
+ viewport?: GridViewport;
57
+ defaultViewport?: Partial<
58
+ Pick<GridViewport, 'offsetX' | 'offsetY' | 'pixelsPerUnitX' | 'pixelsPerUnitY'>
59
+ >;
60
+ viewportConstraints?: GridViewportConstraints;
61
+ zoomLimits?: GridZoomLimits;
37
62
  overscanPixels?: number;
38
63
  focusedItemId?: string;
39
64
  revealPaddingPixels?: number;
40
65
  /** Reports the same measured column count used to position tiles. */
41
66
  onColumnsChange?: (columns: number) => void;
67
+ onViewportChange?: (viewport: GridViewport) => void;
42
68
  onVisibleItemIdsChange?: (ids: readonly string[]) => void;
43
69
  renderItem: (item: TileGridItem) => React.ReactNode;
44
70
  }
@@ -0,0 +1,33 @@
1
+ import type { GridLane, GridLaneInterval, GridViewport } from '@ankhorage/grid-view';
2
+ import type React from 'react';
3
+
4
+ import type { ZoraBaseProps } from './base';
5
+
6
+ /** An ordered, variable-height track rendered by the generic TimeGrid. */
7
+ export type TimeGridLane = GridLane;
8
+
9
+ /** A stable world-space interval rendered by the generic TimeGrid. */
10
+ export type TimeGridInterval = GridLaneInterval;
11
+
12
+ /**
13
+ * Code API for virtualized interval lanes. Domain adapters map dates, PPQ ticks, and other units
14
+ * to numeric world coordinates before reaching this boundary.
15
+ */
16
+ export interface TimeGridProps extends ZoraBaseProps {
17
+ readonly lanes: readonly TimeGridLane[];
18
+ readonly intervals: readonly TimeGridInterval[];
19
+ readonly contentWidth: number;
20
+ readonly width: number;
21
+ readonly height: number;
22
+ readonly zoom?: number;
23
+ readonly overscanPixels?: number;
24
+ readonly focusedIntervalId?: string;
25
+ readonly onFocusedIntervalIdChange?: (id: string) => void;
26
+ readonly revealPaddingPixels?: number;
27
+ readonly selectedIntervalIds?: readonly string[];
28
+ readonly onIntervalPress?: (interval: TimeGridInterval) => void;
29
+ readonly onViewportChange?: (viewport: GridViewport) => void;
30
+ readonly onVisibleIntervalIdsChange?: (ids: readonly string[]) => void;
31
+ readonly renderInterval: (interval: TimeGridInterval, selected: boolean) => React.ReactNode;
32
+ readonly renderLaneLabel?: (lane: TimeGridLane) => React.ReactNode;
33
+ }
@@ -47,6 +47,68 @@ function getVisibleGridItems(items, viewport, overscanPixels = 0) {
47
47
  return items.filter((item) => item.x <= bounds.x + bounds.width && item.x + item.width >= bounds.x && item.y <= bounds.y + bounds.height && item.y + item.height >= bounds.y);
48
48
  }
49
49
 
50
+ // node_modules/@ankhorage/grid-view/dist/features/layout/createGridAxisMetrics.js
51
+ function createGridAxisMetrics(entries) {
52
+ const indexes = new Map;
53
+ const offsets = [];
54
+ const sizes = [];
55
+ let offset = 0;
56
+ entries.forEach((entry, index) => {
57
+ if (!entry.id || indexes.has(entry.id)) {
58
+ throw new RangeError("Layout axis entries require unique nonempty IDs.");
59
+ }
60
+ if (!Number.isFinite(entry.size) || entry.size <= 0) {
61
+ throw new RangeError("Layout axis entry sizes must be finite positive numbers.");
62
+ }
63
+ const end = offset + entry.size;
64
+ if (!Number.isFinite(end)) {
65
+ throw new RangeError("Layout axis cumulative world coordinates must be finite.");
66
+ }
67
+ indexes.set(entry.id, index);
68
+ offsets.push(offset);
69
+ sizes.push(entry.size);
70
+ offset = end;
71
+ });
72
+ return { indexes, offsets, sizes };
73
+ }
74
+
75
+ // node_modules/@ankhorage/grid-view/dist/features/layout/utils/readGridAxisMetric.js
76
+ function readGridAxisMetric(values, index) {
77
+ const value = values.at(index);
78
+ if (value === undefined) {
79
+ throw new RangeError("Layout axis metric indexes must reference an existing entry.");
80
+ }
81
+ return value;
82
+ }
83
+
84
+ // node_modules/@ankhorage/grid-view/dist/features/layout/utils/resolveLaneIntervalPlacement.js
85
+ function resolveLaneIntervalPlacement(interval, lanes) {
86
+ if (!interval.id || !Number.isFinite(interval.start) || !Number.isFinite(interval.extent) || interval.extent <= 0) {
87
+ throw new RangeError("Lane intervals require an ID, finite start, and positive extent.");
88
+ }
89
+ if (!Number.isFinite(interval.start + interval.extent)) {
90
+ throw new RangeError("Lane interval end coordinates must be finite.");
91
+ }
92
+ const laneIndex = lanes.indexes.get(interval.laneId);
93
+ if (laneIndex === undefined) {
94
+ throw new RangeError("Lane intervals must reference an existing lane.");
95
+ }
96
+ return {
97
+ ...interval,
98
+ laneIndex,
99
+ x: interval.start,
100
+ y: readGridAxisMetric(lanes.offsets, laneIndex),
101
+ width: interval.extent,
102
+ height: readGridAxisMetric(lanes.sizes, laneIndex)
103
+ };
104
+ }
105
+
106
+ // node_modules/@ankhorage/grid-view/dist/features/layout/getLaneIntervalPlacement.js
107
+ function getLaneIntervalPlacement(lanes, interval) {
108
+ const laneMetrics = createGridAxisMetrics(lanes.map(({ id, height }) => ({ id, size: height })));
109
+ return resolveLaneIntervalPlacement(interval, laneMetrics);
110
+ }
111
+
50
112
  // node_modules/@ankhorage/grid-view/dist/features/viewport/constrainViewport.js
51
113
  function constrainViewport(viewport, constraints) {
52
114
  assertValidViewport(viewport);
@@ -81,6 +143,18 @@ function isAlignment(value) {
81
143
  return value === "start" || value === "center" || value === "end";
82
144
  }
83
145
 
146
+ // node_modules/@ankhorage/grid-view/dist/features/viewport/panViewport.js
147
+ function panViewport(viewport, displacement, constraints) {
148
+ if (![displacement.x, displacement.y].every(Number.isFinite)) {
149
+ throw new RangeError("Pan displacement must be finite.");
150
+ }
151
+ return constrainViewport({
152
+ ...viewport,
153
+ offsetX: viewport.offsetX - displacement.x / viewport.pixelsPerUnitX,
154
+ offsetY: viewport.offsetY - displacement.y / viewport.pixelsPerUnitY
155
+ }, constraints);
156
+ }
157
+
84
158
  // node_modules/@ankhorage/grid-view/dist/features/viewport/revealWorldRect.js
85
159
  function revealWorldRect(viewport, rect, paddingPixels = 0, constraints) {
86
160
  validateRevealInput(viewport, rect, paddingPixels);
@@ -130,6 +204,34 @@ function worldToViewport(point, viewport) {
130
204
  };
131
205
  }
132
206
 
207
+ // node_modules/@ankhorage/grid-view/dist/features/viewport/zoomViewportAt.js
208
+ function zoomViewportAt(viewport, focalPoint, nextScale, limits = {}, constraints) {
209
+ if (![focalPoint.x, focalPoint.y, nextScale.pixelsPerUnitX, nextScale.pixelsPerUnitY].every(Number.isFinite)) {
210
+ throw new RangeError("Focal points and scales must be finite.");
211
+ }
212
+ const focalWorld = viewportToWorld(focalPoint, viewport);
213
+ const x = constrainScale(nextScale.pixelsPerUnitX, limits.minX, limits.maxX);
214
+ const y = constrainScale(nextScale.pixelsPerUnitY, limits.minY, limits.maxY);
215
+ return constrainViewport({
216
+ ...viewport,
217
+ pixelsPerUnitX: x,
218
+ pixelsPerUnitY: y,
219
+ offsetX: focalWorld.x - focalPoint.x / x,
220
+ offsetY: focalWorld.y - focalPoint.y / y
221
+ }, constraints);
222
+ }
223
+ function constrainScale(scale, minimum, maximum) {
224
+ const min = minimum ?? Number.EPSILON;
225
+ const max = maximum ?? Infinity;
226
+ if (!Number.isFinite(min) || min <= 0 || maximum !== undefined && (!Number.isFinite(max) || max <= 0 || min > max)) {
227
+ throw new RangeError("Zoom limits must be finite positive ranges.");
228
+ }
229
+ if (scale <= 0) {
230
+ throw new RangeError("Viewport scales must be positive.");
231
+ }
232
+ return Math.max(min, Math.min(max, scale));
233
+ }
234
+
133
235
  // node_modules/@ankhorage/grid-view/dist/features/axes/getAxisCategoryTicks.js
134
236
  function getAxisCategoryTicks(viewport, axis, categories) {
135
237
  const bounds = getVisibleWorldBounds(viewport);
@@ -206,4 +308,26 @@ function adaptiveStep(minimum) {
206
308
  const multiplier = [1, 2, 5, 10].find((candidate) => candidate * magnitude >= minimum) ?? 10;
207
309
  return multiplier * magnitude;
208
310
  }
209
- export { getAxisCategoryTicks, getAxisTicks, getVisibleGridItems, revealWorldRect, worldToViewport };
311
+ // node_modules/@ankhorage/grid-view/dist/features/layout/getVisibleLaneIntervals.js
312
+ function getVisibleLaneIntervals(lanes, intervals, viewport, overscanPixels = 0) {
313
+ const laneMetrics = createGridAxisMetrics(lanes.map(({ id, height }) => ({ id, size: height })));
314
+ const bounds = getVisibleWorldBounds(viewport, overscanPixels);
315
+ validateUniqueIds(intervals);
316
+ return intervals.flatMap((interval) => {
317
+ const placement = resolveLaneIntervalPlacement(interval, laneMetrics);
318
+ return intersects(placement.x, placement.width, bounds.x, bounds.width) && intersects(placement.y, placement.height, bounds.y, bounds.height) ? [placement] : [];
319
+ });
320
+ }
321
+ function validateUniqueIds(intervals) {
322
+ const ids = new Set;
323
+ intervals.forEach(({ id }) => {
324
+ if (ids.has(id)) {
325
+ throw new RangeError("Lane intervals require unique IDs.");
326
+ }
327
+ ids.add(id);
328
+ });
329
+ }
330
+ function intersects(firstStart, firstExtent, secondStart, secondExtent) {
331
+ return firstStart <= secondStart + secondExtent && firstStart + firstExtent >= secondStart;
332
+ }
333
+ export { getAxisCategoryTicks, getAxisTicks, getVisibleGridItems, getLaneIntervalPlacement, getVisibleLaneIntervals, constrainViewport, panViewport, revealWorldRect, worldToViewport, zoomViewportAt };
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import {
3
3
  TileGrid2
4
- } from "./Accordion-nxsda1my.js";
4
+ } from "./Accordion-q8exgc3h.js";
5
5
  import {
6
6
  withZoraThemeScope
7
7
  } from "./Accordion-42jfy1a1.js";