@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
@@ -0,0 +1,208 @@
1
+ 'use client';
2
+ import {
3
+ GridView2
4
+ } from "../../chunks/Accordion-q8exgc3h.js";
5
+ import {
6
+ getLaneIntervalPlacement,
7
+ getVisibleLaneIntervals
8
+ } from "../../chunks/Accordion-ebghcyzj.js";
9
+ import {
10
+ require_cjs
11
+ } from "../../chunks/Accordion-xgpzh4wq.js";
12
+ import {
13
+ __toESM
14
+ } from "../../chunks/Accordion-nh0cs9hq.js";
15
+
16
+ // src/features/time-grid/adapters/inbound/TimeGrid.tsx
17
+ var import_react_native = __toESM(require_cjs(), 1);
18
+ import React from "react";
19
+
20
+ // src/features/time-grid/application/resolveTimeGridNextFocusId.ts
21
+ function resolveTimeGridNextFocusId(placements, focusedId, direction) {
22
+ const focused = placements.find((placement) => placement.id === focusedId);
23
+ if (!focused)
24
+ return;
25
+ const candidates = placements.filter((placement) => {
26
+ if (direction === "left")
27
+ return placement.laneId === focused.laneId && placement.x < focused.x;
28
+ if (direction === "right")
29
+ return placement.laneId === focused.laneId && placement.x > focused.x;
30
+ if (direction === "up")
31
+ return placement.laneIndex < focused.laneIndex;
32
+ return placement.laneIndex > focused.laneIndex;
33
+ });
34
+ return candidates.sort((first, second) => resolveFocusDistance(first, focused, direction) - resolveFocusDistance(second, focused, direction)).at(0)?.id;
35
+ }
36
+ function resolveFocusDistance(candidate, focused, direction) {
37
+ const horizontal = direction === "left" || direction === "right";
38
+ const primary = horizontal ? Math.abs(candidate.x - focused.x) : Math.abs(candidate.laneIndex - focused.laneIndex);
39
+ const secondary = horizontal ? Math.abs(candidate.laneIndex - focused.laneIndex) : Math.abs(candidate.x - focused.x);
40
+ return primary * 1e6 + secondary;
41
+ }
42
+
43
+ // src/features/time-grid/application/resolveTimeGridVisibleIntervals.ts
44
+ function resolveTimeGridVisibleIntervals(lanes, intervals, viewport, overscanPixels) {
45
+ return getVisibleLaneIntervals(lanes, intervals, viewport, overscanPixels);
46
+ }
47
+
48
+ // src/features/time-grid/adapters/inbound/TimeGridKeyboardProxy.web.tsx
49
+ import { jsx } from "react/jsx-runtime";
50
+ function TimeGridKeyboardProxy({ children, onKeyDown }) {
51
+ return /* @__PURE__ */ jsx("div", {
52
+ onKeyDown: (event) => {
53
+ if (onKeyDown(event.key))
54
+ event.preventDefault();
55
+ },
56
+ style: { display: "flex", flex: 1 },
57
+ children
58
+ });
59
+ }
60
+
61
+ // src/features/time-grid/adapters/inbound/TimeGrid.tsx
62
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
63
+ function TimeGrid({
64
+ contentWidth,
65
+ focusedIntervalId,
66
+ height,
67
+ interactionPolicy,
68
+ intervals,
69
+ lanes,
70
+ onFocusedIntervalIdChange,
71
+ onIntervalPress,
72
+ onViewportChange,
73
+ onVisibleIntervalIdsChange,
74
+ overscanPixels,
75
+ renderInterval,
76
+ renderLaneLabel,
77
+ revealPaddingPixels,
78
+ selectedIntervalIds = [],
79
+ testID,
80
+ width,
81
+ zoom
82
+ }) {
83
+ const scale = Math.max(0.01, zoom ?? 1);
84
+ const [scrollOffsets, setScrollOffsets] = React.useState(() => ({
85
+ offsetX: 0,
86
+ offsetY: 0
87
+ }));
88
+ const viewport = React.useMemo(() => ({
89
+ ...scrollOffsets,
90
+ height,
91
+ pixelsPerUnitX: scale,
92
+ pixelsPerUnitY: scale,
93
+ width
94
+ }), [height, scale, scrollOffsets, width]);
95
+ const intervalById = React.useMemo(() => new Map(intervals.map((interval) => [interval.id, interval])), [intervals]);
96
+ const selectedIds = React.useMemo(() => new Set(selectedIntervalIds), [selectedIntervalIds]);
97
+ const contentHeight = React.useMemo(() => lanes.reduce((total, lane) => total + lane.height, 0), [lanes]);
98
+ const visibleIntervals = React.useMemo(() => resolveTimeGridVisibleIntervals(lanes, intervals, viewport, overscanPixels), [intervals, lanes, overscanPixels, viewport]);
99
+ const focusedPlacement = React.useMemo(() => {
100
+ const focusedInterval = intervals.find((interval) => interval.id === focusedIntervalId);
101
+ return focusedInterval ? getLaneIntervalPlacement(lanes, focusedInterval) : undefined;
102
+ }, [focusedIntervalId, intervals, lanes]);
103
+ const gridItems = React.useMemo(() => focusedPlacement && !visibleIntervals.some((interval) => interval.id === focusedPlacement.id) ? [...visibleIntervals, focusedPlacement] : visibleIntervals, [focusedPlacement, visibleIntervals]);
104
+ const labelIntervals = React.useMemo(() => lanes.map((lane) => ({
105
+ extent: contentWidth,
106
+ id: `lane-label-${lane.id}`,
107
+ laneId: lane.id,
108
+ start: 0
109
+ })), [contentWidth, lanes]);
110
+ const visibleLabels = React.useMemo(() => resolveTimeGridVisibleIntervals(lanes, labelIntervals, viewport, overscanPixels), [labelIntervals, lanes, overscanPixels, viewport]);
111
+ const handleViewportChange = React.useCallback((nextViewport) => {
112
+ setScrollOffsets((current) => current.offsetX === nextViewport.offsetX && current.offsetY === nextViewport.offsetY ? current : { offsetX: nextViewport.offsetX, offsetY: nextViewport.offsetY });
113
+ onViewportChange?.(nextViewport);
114
+ }, [onViewportChange]);
115
+ const resolveNextFocusId = React.useCallback((intervalId, direction) => {
116
+ const allIntervals = resolveTimeGridVisibleIntervals(lanes, intervals, {
117
+ height: contentHeight,
118
+ offsetX: 0,
119
+ offsetY: 0,
120
+ pixelsPerUnitX: 1,
121
+ pixelsPerUnitY: 1,
122
+ width: contentWidth
123
+ });
124
+ return resolveTimeGridNextFocusId(allIntervals, intervalId, direction);
125
+ }, [contentHeight, contentWidth, intervals, lanes]);
126
+ return /* @__PURE__ */ jsxs(import_react_native.View, {
127
+ style: { flexDirection: "row", height, width },
128
+ testID,
129
+ children: [
130
+ renderLaneLabel ? /* @__PURE__ */ jsx2(import_react_native.View, {
131
+ accessibilityElementsHidden: true,
132
+ pointerEvents: "none",
133
+ style: { height, overflow: "hidden" },
134
+ children: visibleLabels.map((placement) => {
135
+ const lane = lanes[placement.laneIndex];
136
+ if (!lane)
137
+ return null;
138
+ return /* @__PURE__ */ jsx2(import_react_native.View, {
139
+ style: {
140
+ height: placement.height * scale,
141
+ position: "absolute",
142
+ top: (placement.y - viewport.offsetY) * scale
143
+ },
144
+ testID: testID === undefined ? undefined : `${testID}-lane-label-${lane.id}`,
145
+ children: renderLaneLabel(lane)
146
+ }, lane.id);
147
+ })
148
+ }) : null,
149
+ /* @__PURE__ */ jsx2(GridView2, {
150
+ contentHeight,
151
+ contentWidth,
152
+ focusedItemId: focusedIntervalId,
153
+ height,
154
+ interactionPolicy,
155
+ items: gridItems,
156
+ onViewportChange: handleViewportChange,
157
+ onVisibleItemIdsChange: onVisibleIntervalIdsChange,
158
+ overscanPixels,
159
+ renderItem: (placement) => {
160
+ const interval = intervalById.get(placement.id);
161
+ if (!interval)
162
+ return null;
163
+ const selected = selectedIds.has(interval.id);
164
+ return /* @__PURE__ */ jsx2(TimeGridKeyboardProxy, {
165
+ onKeyDown: (key) => {
166
+ const direction = resolveKeyboardDirection(key);
167
+ const nextId = direction === undefined ? undefined : resolveNextFocusId(interval.id, direction);
168
+ if (!nextId)
169
+ return false;
170
+ onFocusedIntervalIdChange?.(nextId);
171
+ return true;
172
+ },
173
+ children: /* @__PURE__ */ jsx2(import_react_native.Pressable, {
174
+ accessibilityLabel: `Interval ${interval.id}`,
175
+ accessibilityRole: "button",
176
+ disabled: interactionPolicy === "passive",
177
+ onPress: () => {
178
+ onFocusedIntervalIdChange?.(interval.id);
179
+ onIntervalPress?.(interval);
180
+ },
181
+ style: { flex: 1 },
182
+ testID: testID === undefined ? undefined : `${testID}-interval-${interval.id}`,
183
+ children: renderInterval(interval, selected)
184
+ })
185
+ });
186
+ },
187
+ revealPaddingPixels,
188
+ testID: testID === undefined ? undefined : `${testID}-viewport`,
189
+ width,
190
+ zoom
191
+ })
192
+ ]
193
+ });
194
+ }
195
+ function resolveKeyboardDirection(key) {
196
+ if (key === "ArrowDown")
197
+ return "down";
198
+ if (key === "ArrowLeft")
199
+ return "left";
200
+ if (key === "ArrowRight")
201
+ return "right";
202
+ if (key === "ArrowUp")
203
+ return "up";
204
+ return;
205
+ }
206
+ export {
207
+ TimeGrid
208
+ };
@@ -0,0 +1 @@
1
+ export * from './TimeGrid';
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ export * from './TimeGrid.js';
@@ -25,7 +25,7 @@ import {
25
25
  import {
26
26
  Text3
27
27
  } from "../../chunks/Accordion-9w8wg9mf.js";
28
- import"../../chunks/Accordion-nxsda1my.js";
28
+ import"../../chunks/Accordion-q8exgc3h.js";
29
29
  import {
30
30
  Icon2
31
31
  } from "../../chunks/Accordion-b96evb46.js";
@@ -34,7 +34,7 @@ import {
34
34
  } from "../../chunks/Accordion-a4cma5b6.js";
35
35
  import {
36
36
  Explorer2
37
- } from "../../chunks/Accordion-s3d6g59s.js";
37
+ } from "../../chunks/Accordion-f43jba23.js";
38
38
  import"../../chunks/Accordion-40tenzcg.js";
39
39
  import"../../chunks/Accordion-45nc4bte.js";
40
40
  import {
@@ -1235,12 +1235,12 @@
1235
1235
  "chunks/Accordion-b96evb46.js",
1236
1236
  "chunks/Accordion-bff0p3x4.js",
1237
1237
  "chunks/Accordion-bfzeab9x.js",
1238
+ "chunks/Accordion-ebghcyzj.js",
1239
+ "chunks/Accordion-f43jba23.js",
1238
1240
  "chunks/Accordion-fre84yaq.js",
1239
1241
  "chunks/Accordion-n4et7etk.js",
1240
1242
  "chunks/Accordion-nh0cs9hq.js",
1241
- "chunks/Accordion-nxsda1my.js",
1242
- "chunks/Accordion-r2w86rwv.js",
1243
- "chunks/Accordion-s3d6g59s.js",
1243
+ "chunks/Accordion-q8exgc3h.js",
1244
1244
  "chunks/Accordion-srjya6dz.js",
1245
1245
  "chunks/Accordion-xgpzh4wq.js",
1246
1246
  "chunks/Accordion-z5a0tx18.js"
@@ -1301,12 +1301,12 @@
1301
1301
  "chunks/Accordion-b96evb46.js",
1302
1302
  "chunks/Accordion-bff0p3x4.js",
1303
1303
  "chunks/Accordion-bfzeab9x.js",
1304
+ "chunks/Accordion-ebghcyzj.js",
1305
+ "chunks/Accordion-f43jba23.js",
1304
1306
  "chunks/Accordion-fre84yaq.js",
1305
1307
  "chunks/Accordion-n4et7etk.js",
1306
1308
  "chunks/Accordion-nh0cs9hq.js",
1307
- "chunks/Accordion-nxsda1my.js",
1308
- "chunks/Accordion-r2w86rwv.js",
1309
- "chunks/Accordion-s3d6g59s.js",
1309
+ "chunks/Accordion-q8exgc3h.js",
1310
1310
  "chunks/Accordion-srjya6dz.js",
1311
1311
  "chunks/Accordion-xgpzh4wq.js",
1312
1312
  "chunks/Accordion-z5a0tx18.js"
@@ -1734,11 +1734,11 @@
1734
1734
  "components/grid-line-overlay/index.d.ts",
1735
1735
  "chunks/Accordion-42jfy1a1.js",
1736
1736
  "chunks/Accordion-59pa0677.js",
1737
- "chunks/Accordion-60wn9xn9.js",
1738
1737
  "chunks/Accordion-6wrr910w.js",
1738
+ "chunks/Accordion-ebghcyzj.js",
1739
1739
  "chunks/Accordion-nh0cs9hq.js",
1740
- "chunks/Accordion-r2w86rwv.js",
1741
1740
  "chunks/Accordion-srjya6dz.js",
1741
+ "chunks/Accordion-szar8dt5.js",
1742
1742
  "chunks/Accordion-xgpzh4wq.js"
1743
1743
  ],
1744
1744
  "sourceKind": "public"
@@ -1754,11 +1754,11 @@
1754
1754
  "components/grid-ruler/index.d.ts",
1755
1755
  "chunks/Accordion-42jfy1a1.js",
1756
1756
  "chunks/Accordion-59pa0677.js",
1757
- "chunks/Accordion-60wn9xn9.js",
1758
1757
  "chunks/Accordion-6wrr910w.js",
1758
+ "chunks/Accordion-ebghcyzj.js",
1759
1759
  "chunks/Accordion-nh0cs9hq.js",
1760
- "chunks/Accordion-r2w86rwv.js",
1761
1760
  "chunks/Accordion-srjya6dz.js",
1761
+ "chunks/Accordion-szar8dt5.js",
1762
1762
  "chunks/Accordion-xgpzh4wq.js"
1763
1763
  ],
1764
1764
  "sourceKind": "public"
@@ -1772,9 +1772,9 @@
1772
1772
  "components/grid-view/GridView.d.ts",
1773
1773
  "components/grid-view/index.js",
1774
1774
  "components/grid-view/index.d.ts",
1775
+ "chunks/Accordion-ebghcyzj.js",
1775
1776
  "chunks/Accordion-nh0cs9hq.js",
1776
- "chunks/Accordion-nxsda1my.js",
1777
- "chunks/Accordion-r2w86rwv.js",
1777
+ "chunks/Accordion-q8exgc3h.js",
1778
1778
  "chunks/Accordion-xgpzh4wq.js"
1779
1779
  ],
1780
1780
  "sourceKind": "public"
@@ -2110,12 +2110,12 @@
2110
2110
  "chunks/Accordion-b96evb46.js",
2111
2111
  "chunks/Accordion-bff0p3x4.js",
2112
2112
  "chunks/Accordion-bfzeab9x.js",
2113
+ "chunks/Accordion-ebghcyzj.js",
2114
+ "chunks/Accordion-f43jba23.js",
2113
2115
  "chunks/Accordion-fre84yaq.js",
2114
2116
  "chunks/Accordion-n4et7etk.js",
2115
2117
  "chunks/Accordion-nh0cs9hq.js",
2116
- "chunks/Accordion-nxsda1my.js",
2117
- "chunks/Accordion-r2w86rwv.js",
2118
- "chunks/Accordion-s3d6g59s.js",
2118
+ "chunks/Accordion-q8exgc3h.js",
2119
2119
  "chunks/Accordion-srjya6dz.js",
2120
2120
  "chunks/Accordion-xgpzh4wq.js",
2121
2121
  "chunks/Accordion-z5a0tx18.js"
@@ -3407,9 +3407,9 @@
3407
3407
  "components/spatial-grid/SpatialGrid.d.ts",
3408
3408
  "components/spatial-grid/index.js",
3409
3409
  "components/spatial-grid/index.d.ts",
3410
+ "chunks/Accordion-ebghcyzj.js",
3410
3411
  "chunks/Accordion-nh0cs9hq.js",
3411
- "chunks/Accordion-nxsda1my.js",
3412
- "chunks/Accordion-r2w86rwv.js",
3412
+ "chunks/Accordion-q8exgc3h.js",
3413
3413
  "chunks/Accordion-xgpzh4wq.js"
3414
3414
  ],
3415
3415
  "sourceKind": "public"
@@ -3663,9 +3663,25 @@
3663
3663
  "components/tile-grid/TileGrid.d.ts",
3664
3664
  "components/tile-grid/index.js",
3665
3665
  "components/tile-grid/index.d.ts",
3666
+ "chunks/Accordion-ebghcyzj.js",
3666
3667
  "chunks/Accordion-nh0cs9hq.js",
3667
- "chunks/Accordion-nxsda1my.js",
3668
- "chunks/Accordion-r2w86rwv.js",
3668
+ "chunks/Accordion-q8exgc3h.js",
3669
+ "chunks/Accordion-xgpzh4wq.js"
3670
+ ],
3671
+ "sourceKind": "public"
3672
+ },
3673
+ {
3674
+ "component": "time-grid",
3675
+ "exportName": "TimeGrid",
3676
+ "featurePath": "time-grid",
3677
+ "files": [
3678
+ "components/time-grid/TimeGrid.js",
3679
+ "components/time-grid/TimeGrid.d.ts",
3680
+ "components/time-grid/index.js",
3681
+ "components/time-grid/index.d.ts",
3682
+ "chunks/Accordion-ebghcyzj.js",
3683
+ "chunks/Accordion-nh0cs9hq.js",
3684
+ "chunks/Accordion-q8exgc3h.js",
3669
3685
  "chunks/Accordion-xgpzh4wq.js"
3670
3686
  ],
3671
3687
  "sourceKind": "public"
@@ -3929,17 +3945,17 @@
3929
3945
  "chunks/Accordion-be2yhfqz.js",
3930
3946
  "chunks/Accordion-bff0p3x4.js",
3931
3947
  "chunks/Accordion-bfzeab9x.js",
3948
+ "chunks/Accordion-ebghcyzj.js",
3932
3949
  "chunks/Accordion-eqvdv7tt.js",
3950
+ "chunks/Accordion-f43jba23.js",
3933
3951
  "chunks/Accordion-fre84yaq.js",
3934
3952
  "chunks/Accordion-kjtcbe09.js",
3935
3953
  "chunks/Accordion-n4et7etk.js",
3936
3954
  "chunks/Accordion-n7y08rz5.js",
3937
3955
  "chunks/Accordion-nh0cs9hq.js",
3938
3956
  "chunks/Accordion-nnv76yff.js",
3939
- "chunks/Accordion-nxsda1my.js",
3940
3957
  "chunks/Accordion-pvj5npzc.js",
3941
- "chunks/Accordion-r2w86rwv.js",
3942
- "chunks/Accordion-s3d6g59s.js",
3958
+ "chunks/Accordion-q8exgc3h.js",
3943
3959
  "chunks/Accordion-srjya6dz.js",
3944
3960
  "chunks/Accordion-wyxmd0n0.js",
3945
3961
  "chunks/Accordion-xgpzh4wq.js",
@@ -1,194 +0,0 @@
1
- 'use client';
2
- import {
3
- getVisibleGridItems,
4
- revealWorldRect,
5
- worldToViewport
6
- } from "./Accordion-r2w86rwv.js";
7
- import {
8
- require_cjs
9
- } from "./Accordion-xgpzh4wq.js";
10
- import {
11
- __toESM
12
- } from "./Accordion-nh0cs9hq.js";
13
-
14
- // src/features/grid-view/adapters/inbound/GridView.tsx
15
- var import_react_native = __toESM(require_cjs(), 1);
16
- import React from "react";
17
- import { jsx } from "react/jsx-runtime";
18
- function GridView2({
19
- items,
20
- contentWidth,
21
- contentHeight,
22
- width,
23
- height,
24
- zoom = 1,
25
- overscanPixels = 160,
26
- focusedItemId,
27
- revealPaddingPixels = 8,
28
- interactionPolicy,
29
- onViewportChange,
30
- onVisibleItemIdsChange,
31
- renderItem,
32
- testID
33
- }) {
34
- const [scrollX, setScrollX] = React.useState(0);
35
- const [scrollY, setScrollY] = React.useState(0);
36
- const horizontalScrollRef = React.useRef(null);
37
- const verticalScrollRef = React.useRef(null);
38
- const scale = Math.max(0.01, zoom);
39
- const viewport = React.useMemo(() => ({
40
- width,
41
- height,
42
- offsetX: scrollX / scale,
43
- offsetY: scrollY / scale,
44
- pixelsPerUnitX: scale,
45
- pixelsPerUnitY: scale
46
- }), [height, scale, scrollX, scrollY, width]);
47
- const visibleItems = React.useMemo(() => getVisibleGridItems(items, viewport, overscanPixels), [items, overscanPixels, viewport]);
48
- const viewportVisibleIds = React.useMemo(() => getVisibleGridItems(visibleItems, viewport).map((item) => item.id), [viewport, visibleItems]);
49
- const previousVisibleIdsRef = React.useRef([]);
50
- React.useEffect(() => {
51
- if (!onVisibleItemIdsChange)
52
- return;
53
- const previous = previousVisibleIdsRef.current;
54
- if (previous.length === viewportVisibleIds.length && previous.every((id, index) => id === viewportVisibleIds.at(index))) {
55
- return;
56
- }
57
- previousVisibleIdsRef.current = viewportVisibleIds;
58
- onVisibleItemIdsChange(viewportVisibleIds);
59
- }, [onVisibleItemIdsChange, viewportVisibleIds]);
60
- React.useEffect(() => {
61
- onViewportChange?.(viewport);
62
- }, [onViewportChange, viewport]);
63
- const viewportRef = React.useRef(viewport);
64
- React.useEffect(() => {
65
- viewportRef.current = viewport;
66
- }, [viewport]);
67
- React.useEffect(() => {
68
- const currentViewport = viewportRef.current;
69
- const focusedItem = items.find((item) => item.id === focusedItemId);
70
- if (!focusedItem)
71
- return;
72
- const revealed = revealWorldRect(currentViewport, focusedItem, revealPaddingPixels);
73
- if (revealed.offsetX !== currentViewport.offsetX) {
74
- horizontalScrollRef.current?.scrollTo({ x: revealed.offsetX * scale, animated: true });
75
- }
76
- if (revealed.offsetY !== currentViewport.offsetY) {
77
- verticalScrollRef.current?.scrollTo({ y: revealed.offsetY * scale, animated: true });
78
- }
79
- }, [focusedItemId, height, items, revealPaddingPixels, scale, width]);
80
- return /* @__PURE__ */ jsx(import_react_native.ScrollView, {
81
- ref: horizontalScrollRef,
82
- horizontal: true,
83
- scrollEnabled: interactionPolicy !== "passive",
84
- scrollEventThrottle: 32,
85
- showsHorizontalScrollIndicator: true,
86
- style: { width, height },
87
- testID,
88
- onScroll: (event) => setScrollX(event.nativeEvent.contentOffset.x),
89
- children: /* @__PURE__ */ jsx(import_react_native.ScrollView, {
90
- ref: verticalScrollRef,
91
- scrollEnabled: interactionPolicy !== "passive",
92
- scrollEventThrottle: 32,
93
- showsVerticalScrollIndicator: true,
94
- style: { width: contentWidth * scale, height },
95
- onScroll: (event) => setScrollY(event.nativeEvent.contentOffset.y),
96
- children: /* @__PURE__ */ jsx(import_react_native.View, {
97
- style: { width: contentWidth * scale, height: contentHeight * scale },
98
- children: visibleItems.map((item) => {
99
- const position = worldToViewport({ x: item.x, y: item.y }, {
100
- ...viewport,
101
- offsetX: 0,
102
- offsetY: 0
103
- });
104
- return /* @__PURE__ */ jsx(import_react_native.View, {
105
- style: {
106
- position: "absolute",
107
- left: position.x,
108
- top: position.y,
109
- width: item.width * scale,
110
- height: item.height * scale
111
- },
112
- children: renderItem(item)
113
- }, item.id);
114
- })
115
- })
116
- })
117
- });
118
- }
119
-
120
- // src/features/grid-view/adapters/inbound/TileGrid.tsx
121
- var import_react_native2 = __toESM(require_cjs(), 1);
122
- import React2 from "react";
123
-
124
- // src/features/grid-view/application/layoutTileGrid.ts
125
- function layoutTileGrid(items, viewportWidth, tileSize, gap, zoom = 1) {
126
- if (![viewportWidth, tileSize, gap, zoom].every(Number.isFinite) || viewportWidth < 0 || tileSize <= 0 || gap < 0 || zoom <= 0) {
127
- throw new RangeError("Tile layout requires finite, nonnegative dimensions and positive scales.");
128
- }
129
- const columns = Math.max(1, Math.floor((viewportWidth / zoom + gap) / (tileSize + gap)));
130
- const rows = Math.ceil(items.length / columns);
131
- return {
132
- columns,
133
- width: columns * (tileSize + gap) - gap,
134
- height: Math.max(0, rows * (tileSize + gap) - gap),
135
- items: items.map((item, index) => ({
136
- id: item.id,
137
- x: index % columns * (tileSize + gap),
138
- y: Math.floor(index / columns) * (tileSize + gap),
139
- width: tileSize,
140
- height: tileSize
141
- }))
142
- };
143
- }
144
-
145
- // src/features/grid-view/adapters/inbound/TileGrid.tsx
146
- import { jsx as jsx2 } from "react/jsx-runtime";
147
- function TileGrid2({
148
- items,
149
- width,
150
- height = 440,
151
- tileSize = 120,
152
- gap = 12,
153
- zoom = 1,
154
- overscanPixels,
155
- focusedItemId,
156
- revealPaddingPixels,
157
- onColumnsChange,
158
- onVisibleItemIdsChange,
159
- renderItem,
160
- interactionPolicy,
161
- testID
162
- }) {
163
- const [measuredWidth, setMeasuredWidth] = React2.useState(0);
164
- const resolvedWidth = width ?? measuredWidth;
165
- const layout = React2.useMemo(() => layoutTileGrid(items, resolvedWidth, tileSize, gap, zoom), [items, resolvedWidth, tileSize, gap, zoom]);
166
- const itemLookup = React2.useMemo(() => new Map(items.map((item) => [item.id, item])), [items]);
167
- React2.useEffect(() => {
168
- if (resolvedWidth > 0)
169
- onColumnsChange?.(layout.columns);
170
- }, [layout.columns, onColumnsChange, resolvedWidth]);
171
- return /* @__PURE__ */ jsx2(import_react_native2.View, {
172
- onLayout: (event) => setMeasuredWidth(event.nativeEvent.layout.width),
173
- style: { width, height, overflow: "hidden" },
174
- testID,
175
- children: resolvedWidth > 0 ? /* @__PURE__ */ jsx2(GridView2, {
176
- contentHeight: layout.height,
177
- contentWidth: Math.max(resolvedWidth / zoom, layout.width),
178
- height,
179
- focusedItemId,
180
- interactionPolicy,
181
- items: layout.items,
182
- onVisibleItemIdsChange,
183
- overscanPixels,
184
- renderItem: (item) => {
185
- const source = itemLookup.get(item.id);
186
- return source ? renderItem(source) : null;
187
- },
188
- revealPaddingPixels,
189
- width: resolvedWidth,
190
- zoom
191
- }) : null
192
- });
193
- }
194
- export { GridView2, TileGrid2 };