@ankhorage/zora 25.0.1 → 25.2.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 (86) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +2 -2
  3. package/dist/features/explorer/adapters/inbound/Explorer.d.ts.map +1 -1
  4. package/dist/features/explorer/adapters/inbound/Explorer.js +72 -14
  5. package/dist/features/explorer/adapters/inbound/Explorer.js.map +1 -1
  6. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.d.ts +9 -0
  7. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.d.ts.map +1 -0
  8. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.js +5 -0
  9. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.js.map +1 -0
  10. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.native.d.ts +9 -0
  11. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.native.d.ts.map +1 -0
  12. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.native.js +5 -0
  13. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.native.js.map +1 -0
  14. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.web.d.ts +9 -0
  15. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.web.d.ts.map +1 -0
  16. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.web.js +10 -0
  17. package/dist/features/explorer/adapters/inbound/ExplorerKeyboardProxy.web.js.map +1 -0
  18. package/dist/features/explorer/adapters/inbound/useExplorerKeyboardFocus.d.ts +14 -0
  19. package/dist/features/explorer/adapters/inbound/useExplorerKeyboardFocus.d.ts.map +1 -0
  20. package/dist/features/explorer/adapters/inbound/useExplorerKeyboardFocus.js +54 -0
  21. package/dist/features/explorer/adapters/inbound/useExplorerKeyboardFocus.js.map +1 -0
  22. package/dist/features/explorer/application/getExplorerNextFocusId.d.ts +6 -0
  23. package/dist/features/explorer/application/getExplorerNextFocusId.d.ts.map +1 -0
  24. package/dist/features/explorer/application/getExplorerNextFocusId.js +53 -0
  25. package/dist/features/explorer/application/getExplorerNextFocusId.js.map +1 -0
  26. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.d.ts +8 -0
  27. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.d.ts.map +1 -0
  28. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.js +9 -0
  29. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.js.map +1 -0
  30. package/dist/features/explorer/application/shouldRequestExplorerPage.d.ts +4 -0
  31. package/dist/features/explorer/application/shouldRequestExplorerPage.d.ts.map +1 -0
  32. package/dist/features/explorer/application/shouldRequestExplorerPage.js +14 -0
  33. package/dist/features/explorer/application/shouldRequestExplorerPage.js.map +1 -0
  34. package/dist/features/explorer/meta.d.ts +110 -0
  35. package/dist/features/explorer/meta.d.ts.map +1 -1
  36. package/dist/features/explorer/meta.js +25 -0
  37. package/dist/features/explorer/meta.js.map +1 -1
  38. package/dist/features/explorer/public.d.ts +2 -1
  39. package/dist/features/explorer/public.d.ts.map +1 -1
  40. package/dist/features/explorer/public.js +1 -0
  41. package/dist/features/explorer/public.js.map +1 -1
  42. package/dist/features/grid-view/adapters/inbound/GridView.d.ts +1 -1
  43. package/dist/features/grid-view/adapters/inbound/GridView.d.ts.map +1 -1
  44. package/dist/features/grid-view/adapters/inbound/GridView.js +36 -4
  45. package/dist/features/grid-view/adapters/inbound/GridView.js.map +1 -1
  46. package/dist/features/grid-view/adapters/inbound/TileGrid.d.ts +1 -1
  47. package/dist/features/grid-view/adapters/inbound/TileGrid.d.ts.map +1 -1
  48. package/dist/features/grid-view/adapters/inbound/TileGrid.js +7 -3
  49. package/dist/features/grid-view/adapters/inbound/TileGrid.js.map +1 -1
  50. package/dist/types/explorer.d.ts +28 -0
  51. package/dist/types/explorer.d.ts.map +1 -1
  52. package/dist/types/explorer.js.map +1 -1
  53. package/dist/types/grid-view.d.ts +10 -0
  54. package/dist/types/grid-view.d.ts.map +1 -1
  55. package/dist/types/grid-view.js.map +1 -1
  56. package/package.json +1 -1
  57. package/src/capabilities/index.test.ts +10 -6
  58. package/src/features/explorer/adapters/inbound/Explorer.tsx +158 -53
  59. package/src/features/explorer/adapters/inbound/ExplorerKeyboardProxy.native.tsx +11 -0
  60. package/src/features/explorer/adapters/inbound/ExplorerKeyboardProxy.tsx +11 -0
  61. package/src/features/explorer/adapters/inbound/ExplorerKeyboardProxy.web.tsx +20 -0
  62. package/src/features/explorer/adapters/inbound/useExplorerKeyboardFocus.test.tsx +232 -0
  63. package/src/features/explorer/adapters/inbound/useExplorerKeyboardFocus.ts +77 -0
  64. package/src/features/explorer/application/getExplorerNextFocusId.test.ts +37 -0
  65. package/src/features/explorer/application/getExplorerNextFocusId.ts +61 -0
  66. package/src/features/explorer/application/shouldDispatchExplorerPageRequest.test.ts +43 -0
  67. package/src/features/explorer/application/shouldDispatchExplorerPageRequest.ts +18 -0
  68. package/src/features/explorer/application/shouldRequestExplorerPage.test.ts +93 -0
  69. package/src/features/explorer/application/shouldRequestExplorerPage.ts +26 -0
  70. package/src/features/explorer/meta.test.ts +55 -0
  71. package/src/features/explorer/meta.ts +25 -0
  72. package/src/features/explorer/public.ts +3 -0
  73. package/src/features/grid-view/adapters/inbound/GridView.tsx +49 -1
  74. package/src/features/grid-view/adapters/inbound/TileGrid.tsx +11 -0
  75. package/src/types/explorer.ts +30 -0
  76. package/src/types/grid-view.ts +10 -0
  77. package/web-dist/chunks/{Accordion-b20zfsfz.js → Accordion-54k0ncs3.js} +83 -0
  78. package/web-dist/chunks/Accordion-kkr7xfh2.js +397 -0
  79. package/web-dist/components/explorer/Explorer.js +2 -2
  80. package/web-dist/components/file-explorer/FileExplorer.js +2 -2
  81. package/web-dist/components/grid-view/GridView.js +1 -1
  82. package/web-dist/components/media-explorer/MediaExplorer.js +2 -2
  83. package/web-dist/components/tile-grid/TileGrid.js +1 -1
  84. package/web-dist/components/uploader/Uploader.js +2 -2
  85. package/web-dist/manifest.json +10 -10
  86. package/web-dist/chunks/Accordion-0md8wbtx.js +0 -197
@@ -1223,20 +1223,20 @@
1223
1223
  "components/explorer/index.js",
1224
1224
  "components/explorer/index.d.ts",
1225
1225
  "chunks/Accordion-09qs8gt1.js",
1226
- "chunks/Accordion-0md8wbtx.js",
1227
1226
  "chunks/Accordion-184r2r82.js",
1228
1227
  "chunks/Accordion-42jfy1a1.js",
1228
+ "chunks/Accordion-54k0ncs3.js",
1229
1229
  "chunks/Accordion-59pa0677.js",
1230
1230
  "chunks/Accordion-6a2hscrx.js",
1231
1231
  "chunks/Accordion-6wrr910w.js",
1232
1232
  "chunks/Accordion-8f0nekwe.js",
1233
1233
  "chunks/Accordion-afmybp67.js",
1234
- "chunks/Accordion-b20zfsfz.js",
1235
1234
  "chunks/Accordion-bb8y34wh.js",
1236
1235
  "chunks/Accordion-bff0p3x4.js",
1237
1236
  "chunks/Accordion-bfzeab9x.js",
1238
1237
  "chunks/Accordion-f0jsd9f9.js",
1239
1238
  "chunks/Accordion-fre84yaq.js",
1239
+ "chunks/Accordion-kkr7xfh2.js",
1240
1240
  "chunks/Accordion-mej71qnw.js",
1241
1241
  "chunks/Accordion-n4et7etk.js",
1242
1242
  "chunks/Accordion-nh0cs9hq.js",
@@ -1288,20 +1288,20 @@
1288
1288
  "components/file-explorer/index.js",
1289
1289
  "components/file-explorer/index.d.ts",
1290
1290
  "chunks/Accordion-09qs8gt1.js",
1291
- "chunks/Accordion-0md8wbtx.js",
1292
1291
  "chunks/Accordion-184r2r82.js",
1293
1292
  "chunks/Accordion-42jfy1a1.js",
1293
+ "chunks/Accordion-54k0ncs3.js",
1294
1294
  "chunks/Accordion-59pa0677.js",
1295
1295
  "chunks/Accordion-6a2hscrx.js",
1296
1296
  "chunks/Accordion-6wrr910w.js",
1297
1297
  "chunks/Accordion-8f0nekwe.js",
1298
1298
  "chunks/Accordion-afmybp67.js",
1299
- "chunks/Accordion-b20zfsfz.js",
1300
1299
  "chunks/Accordion-bb8y34wh.js",
1301
1300
  "chunks/Accordion-bff0p3x4.js",
1302
1301
  "chunks/Accordion-bfzeab9x.js",
1303
1302
  "chunks/Accordion-f0jsd9f9.js",
1304
1303
  "chunks/Accordion-fre84yaq.js",
1304
+ "chunks/Accordion-kkr7xfh2.js",
1305
1305
  "chunks/Accordion-mej71qnw.js",
1306
1306
  "chunks/Accordion-n4et7etk.js",
1307
1307
  "chunks/Accordion-nh0cs9hq.js",
@@ -1730,7 +1730,7 @@
1730
1730
  "components/grid-view/GridView.d.ts",
1731
1731
  "components/grid-view/index.js",
1732
1732
  "components/grid-view/index.d.ts",
1733
- "chunks/Accordion-b20zfsfz.js",
1733
+ "chunks/Accordion-54k0ncs3.js",
1734
1734
  "chunks/Accordion-nh0cs9hq.js",
1735
1735
  "chunks/Accordion-xgpzh4wq.js"
1736
1736
  ],
@@ -2055,20 +2055,20 @@
2055
2055
  "components/media-explorer/index.js",
2056
2056
  "components/media-explorer/index.d.ts",
2057
2057
  "chunks/Accordion-09qs8gt1.js",
2058
- "chunks/Accordion-0md8wbtx.js",
2059
2058
  "chunks/Accordion-184r2r82.js",
2060
2059
  "chunks/Accordion-42jfy1a1.js",
2060
+ "chunks/Accordion-54k0ncs3.js",
2061
2061
  "chunks/Accordion-59pa0677.js",
2062
2062
  "chunks/Accordion-6a2hscrx.js",
2063
2063
  "chunks/Accordion-6wrr910w.js",
2064
2064
  "chunks/Accordion-8f0nekwe.js",
2065
2065
  "chunks/Accordion-afmybp67.js",
2066
- "chunks/Accordion-b20zfsfz.js",
2067
2066
  "chunks/Accordion-bb8y34wh.js",
2068
2067
  "chunks/Accordion-bff0p3x4.js",
2069
2068
  "chunks/Accordion-bfzeab9x.js",
2070
2069
  "chunks/Accordion-f0jsd9f9.js",
2071
2070
  "chunks/Accordion-fre84yaq.js",
2071
+ "chunks/Accordion-kkr7xfh2.js",
2072
2072
  "chunks/Accordion-mej71qnw.js",
2073
2073
  "chunks/Accordion-n4et7etk.js",
2074
2074
  "chunks/Accordion-nh0cs9hq.js",
@@ -3603,7 +3603,7 @@
3603
3603
  "components/tile-grid/TileGrid.d.ts",
3604
3604
  "components/tile-grid/index.js",
3605
3605
  "components/tile-grid/index.d.ts",
3606
- "chunks/Accordion-b20zfsfz.js",
3606
+ "chunks/Accordion-54k0ncs3.js",
3607
3607
  "chunks/Accordion-nh0cs9hq.js",
3608
3608
  "chunks/Accordion-xgpzh4wq.js"
3609
3609
  ],
@@ -3848,11 +3848,11 @@
3848
3848
  "components/uploader/index.d.ts",
3849
3849
  "chunks/Accordion-09qs8gt1.js",
3850
3850
  "chunks/Accordion-0gfsj9qh.js",
3851
- "chunks/Accordion-0md8wbtx.js",
3852
3851
  "chunks/Accordion-184r2r82.js",
3853
3852
  "chunks/Accordion-2nesr9cv.js",
3854
3853
  "chunks/Accordion-42jfy1a1.js",
3855
3854
  "chunks/Accordion-45nc4bte.js",
3855
+ "chunks/Accordion-54k0ncs3.js",
3856
3856
  "chunks/Accordion-59pa0677.js",
3857
3857
  "chunks/Accordion-61e19g3e.js",
3858
3858
  "chunks/Accordion-6a2hscrx.js",
@@ -3860,7 +3860,6 @@
3860
3860
  "chunks/Accordion-6zb9d92y.js",
3861
3861
  "chunks/Accordion-8f0nekwe.js",
3862
3862
  "chunks/Accordion-afmybp67.js",
3863
- "chunks/Accordion-b20zfsfz.js",
3864
3863
  "chunks/Accordion-bb8y34wh.js",
3865
3864
  "chunks/Accordion-be2yhfqz.js",
3866
3865
  "chunks/Accordion-bff0p3x4.js",
@@ -3869,6 +3868,7 @@
3869
3868
  "chunks/Accordion-f0jsd9f9.js",
3870
3869
  "chunks/Accordion-fkc50r9z.js",
3871
3870
  "chunks/Accordion-fre84yaq.js",
3871
+ "chunks/Accordion-kkr7xfh2.js",
3872
3872
  "chunks/Accordion-mej71qnw.js",
3873
3873
  "chunks/Accordion-mh67wb34.js",
3874
3874
  "chunks/Accordion-n4et7etk.js",
@@ -1,197 +0,0 @@
1
- 'use client';
2
- import {
3
- TileGrid2
4
- } from "./Accordion-b20zfsfz.js";
5
- import {
6
- withZoraThemeScope
7
- } from "./Accordion-42jfy1a1.js";
8
- import {
9
- Icon2
10
- } from "./Accordion-bb8y34wh.js";
11
- import {
12
- Image2
13
- } from "./Accordion-mej71qnw.js";
14
- import {
15
- Text3
16
- } from "./Accordion-afmybp67.js";
17
- import {
18
- applySelectionIntent
19
- } from "./Accordion-n4et7etk.js";
20
- import {
21
- useZoraTheme2
22
- } from "./Accordion-srjya6dz.js";
23
- import {
24
- require_cjs
25
- } from "./Accordion-xgpzh4wq.js";
26
- import {
27
- __toESM
28
- } from "./Accordion-nh0cs9hq.js";
29
-
30
- // src/features/explorer/adapters/inbound/Explorer.tsx
31
- var import_react_native = __toESM(require_cjs(), 1);
32
- import React from "react";
33
-
34
- // src/features/explorer/application/resolveExplorerSelection.ts
35
- function resolveExplorerSelection(orderedIds, currentIds, targetId, anchorId, intent, mode) {
36
- const targetIndex = orderedIds.indexOf(targetId);
37
- if (targetIndex < 0)
38
- return currentIds;
39
- if (mode === "single" || intent === "replace")
40
- return applySelectionIntent(currentIds, targetId, "replace");
41
- if (intent === "toggle") {
42
- return applySelectionIntent(currentIds, targetId, "toggle");
43
- }
44
- const anchorIndex = anchorId === null ? -1 : orderedIds.indexOf(anchorId);
45
- if (anchorIndex < 0)
46
- return [targetId];
47
- const start = Math.min(anchorIndex, targetIndex);
48
- const end = Math.max(anchorIndex, targetIndex);
49
- return orderedIds.slice(start, end + 1);
50
- }
51
-
52
- // src/features/explorer/adapters/inbound/Explorer.tsx
53
- import { jsx, jsxs } from "react/jsx-runtime";
54
- var Explorer2 = withZoraThemeScope(ExplorerInner);
55
- function ExplorerInner({
56
- items,
57
- selectedIds,
58
- defaultSelectedIds = [],
59
- selectionMode = "single",
60
- onSelectionChange,
61
- onActivate,
62
- width,
63
- height,
64
- tileSize = 120,
65
- zoom = 1,
66
- loading = false,
67
- errorText,
68
- emptyText = "No items",
69
- disabled = false,
70
- readOnly = false,
71
- interactionPolicy,
72
- testID
73
- }) {
74
- const { theme } = useZoraTheme2();
75
- const [internalSelectedIds, setInternalSelectedIds] = React.useState(defaultSelectedIds);
76
- const anchorId = React.useRef(null);
77
- const effectiveSelectedIds = selectedIds ?? internalSelectedIds;
78
- const itemLookup = React.useMemo(() => new Map(items.map((item) => [item.id, item])), [items]);
79
- const ids = items.filter((item) => !item.disabled).map((item) => item.id);
80
- const selected = new Set(effectiveSelectedIds);
81
- const passive = interactionPolicy === "passive" || disabled || readOnly;
82
- const select = (item, intent) => {
83
- if (passive || item.disabled)
84
- return;
85
- const next = resolveExplorerSelection(ids, effectiveSelectedIds, item.id, anchorId.current, intent, selectionMode);
86
- if (intent !== "range")
87
- anchorId.current = item.id;
88
- if (selectedIds === undefined)
89
- setInternalSelectedIds(next);
90
- onSelectionChange?.({ selectedIds: next });
91
- };
92
- const renderTile = (tile) => {
93
- const item = itemLookup.get(tile.id);
94
- if (!item)
95
- return null;
96
- const isSelected = selected.has(item.id);
97
- const canInteract = !passive && !item.disabled;
98
- return /* @__PURE__ */ jsxs(import_react_native.Pressable, {
99
- accessibilityLabel: item.name,
100
- accessibilityRole: "button",
101
- accessibilityState: { selected: isSelected, disabled: !canInteract },
102
- disabled: !canInteract,
103
- onLongPress: () => select(item, "toggle"),
104
- onPress: (event) => {
105
- const intent = resolveExplorerPressIntent(event.nativeEvent);
106
- select(item, intent);
107
- if (selectionMode === "single" && intent === "replace") {
108
- onActivate?.({ id: item.id });
109
- }
110
- },
111
- style: {
112
- flex: 1,
113
- overflow: "hidden",
114
- borderRadius: 8,
115
- borderWidth: isSelected ? 2 : 1,
116
- borderColor: isSelected ? theme.colors.primary : theme.semantics.neutral.divider,
117
- backgroundColor: theme.semantics.neutral.surface,
118
- padding: 8,
119
- gap: 4
120
- },
121
- testID: `explorer-item-${item.id}`,
122
- children: [
123
- /* @__PURE__ */ jsx(import_react_native.View, {
124
- style: { flex: 1, alignItems: "center", justifyContent: "center" },
125
- children: item.thumbnailUri ? /* @__PURE__ */ jsx(Image2, {
126
- accessibilityLabel: item.name,
127
- aspectRatio: 1,
128
- source: item.thumbnailUri,
129
- width: "100%"
130
- }) : /* @__PURE__ */ jsx(Icon2, {
131
- name: item.kind === "folder" ? "folder-outline" : "document-outline",
132
- size: 32
133
- })
134
- }),
135
- /* @__PURE__ */ jsx(Text3, {
136
- numberOfLines: 1,
137
- variant: "caption",
138
- children: item.name
139
- })
140
- ]
141
- });
142
- };
143
- if (errorText)
144
- return /* @__PURE__ */ jsx(Text3, {
145
- testID,
146
- children: errorText
147
- });
148
- if (loading)
149
- return /* @__PURE__ */ jsx(Text3, {
150
- testID,
151
- children: "Loading…"
152
- });
153
- if (items.length === 0)
154
- return /* @__PURE__ */ jsx(Text3, {
155
- testID,
156
- children: emptyText
157
- });
158
- return /* @__PURE__ */ jsx(TileGrid2, {
159
- height,
160
- interactionPolicy,
161
- items,
162
- renderItem: renderTile,
163
- testID,
164
- tileSize,
165
- width,
166
- zoom
167
- });
168
- }
169
- function resolveExplorerPressIntent(event) {
170
- if (typeof event !== "object" || event === null)
171
- return "replace";
172
- if ("shiftKey" in event && event.shiftKey === true)
173
- return "range";
174
- if ("ctrlKey" in event && event.ctrlKey === true)
175
- return "toggle";
176
- if ("metaKey" in event && event.metaKey === true)
177
- return "toggle";
178
- return "replace";
179
- }
180
-
181
- // src/features/explorer/adapters/inbound/FileExplorer.tsx
182
- import { jsx as jsx2 } from "react/jsx-runtime";
183
- function FileExplorer2(props) {
184
- return /* @__PURE__ */ jsx2(Explorer2, {
185
- ...props
186
- });
187
- }
188
-
189
- // src/features/explorer/adapters/inbound/MediaExplorer.tsx
190
- import { jsx as jsx3 } from "react/jsx-runtime";
191
- function MediaExplorer2(props) {
192
- return /* @__PURE__ */ jsx3(Explorer2, {
193
- ...props,
194
- items: props.items.filter((item) => item.kind === "image" || item.kind === "video" || item.kind === "audio")
195
- });
196
- }
197
- export { Explorer2, FileExplorer2, MediaExplorer2 };