@opengeni/react 6.1.0 → 7.0.0-canary.35585322809001

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 (206) hide show
  1. package/README.md +83 -2
  2. package/dist/artifacts-document.js +1 -1
  3. package/dist/artifacts-presentation.js +1 -1
  4. package/dist/artifacts-spreadsheet.js +1 -1
  5. package/dist/artifacts.js +3 -3
  6. package/dist/{browser-viewer-NTD6UIPR.js → browser-viewer-LGH4IP47.js} +3 -3
  7. package/dist/capability-catalog-row.d.ts +20 -0
  8. package/dist/capability-logo-fallback.d.ts +3 -0
  9. package/dist/{chunk-NOSYBS2D.js → chunk-2VHARTBL.js} +2 -1
  10. package/dist/{chunk-VRBL3F5E.js → chunk-5GAL23FF.js} +10 -2
  11. package/dist/{chunk-VRBL3F5E.js.map → chunk-5GAL23FF.js.map} +1 -1
  12. package/dist/chunk-5UONOQ3Y.js +635 -0
  13. package/dist/chunk-5UONOQ3Y.js.map +1 -0
  14. package/dist/{chunk-NYESIADM.js → chunk-AKOMC3VO.js} +3 -3
  15. package/dist/chunk-AKOMC3VO.js.map +1 -0
  16. package/dist/chunk-BRM6FVZA.js +302 -0
  17. package/dist/chunk-BRM6FVZA.js.map +1 -0
  18. package/dist/{chunk-TDSEILUH.js → chunk-D5NOQPLR.js} +1289 -1530
  19. package/dist/chunk-D5NOQPLR.js.map +1 -0
  20. package/dist/chunk-D7GAPJ3V.js +1558 -0
  21. package/dist/chunk-D7GAPJ3V.js.map +1 -0
  22. package/dist/{chunk-5M6VTFJ5.js → chunk-GBPCZH3Y.js} +2 -2
  23. package/dist/{chunk-YBM6CQRU.js → chunk-GEN54DU5.js} +4 -4
  24. package/dist/{chunk-UMECRJRV.js → chunk-HJ5VJ4JB.js} +21 -12
  25. package/dist/chunk-HJ5VJ4JB.js.map +1 -0
  26. package/dist/{chunk-R4KRSFGA.js → chunk-IP4BUBKH.js} +3 -3
  27. package/dist/{chunk-KANFU34B.js → chunk-IYUPN32E.js} +6 -2
  28. package/dist/chunk-IYUPN32E.js.map +1 -0
  29. package/dist/{chunk-L2NBTKRX.js → chunk-JKLGJQO5.js} +193 -12
  30. package/dist/chunk-JKLGJQO5.js.map +1 -0
  31. package/dist/{chunk-NLTS7JHI.js → chunk-JPHDWKZE.js} +5 -5
  32. package/dist/{chunk-ICA6R6TW.js → chunk-OWHPKAOV.js} +28 -20
  33. package/dist/chunk-OWHPKAOV.js.map +1 -0
  34. package/dist/{chunk-24M4YBCL.js → chunk-PNAVEK2U.js} +4 -4
  35. package/dist/{chunk-45XEUVTK.js → chunk-UXE5SSNN.js} +293 -463
  36. package/dist/chunk-UXE5SSNN.js.map +1 -0
  37. package/dist/{chunk-PEI6RANI.js → chunk-VR4Z73EU.js} +203 -9
  38. package/dist/chunk-VR4Z73EU.js.map +1 -0
  39. package/dist/{chunk-HUIKIDM5.js → chunk-XMXRI5JK.js} +65 -18
  40. package/dist/chunk-XMXRI5JK.js.map +1 -0
  41. package/dist/client.d.ts +1 -1
  42. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  43. package/dist/components/chat-composer.d.ts +13 -3
  44. package/dist/components/markdown.d.ts +4 -3
  45. package/dist/components/message-timeline.d.ts +7 -2
  46. package/dist/components/preview-loading.d.ts +2 -0
  47. package/dist/components/session-capability-frame.d.ts +24 -0
  48. package/dist/components/session-chrome.d.ts +1 -2
  49. package/dist/components/session-commands.d.ts +6 -0
  50. package/dist/components/session-connection-request.d.ts +8 -0
  51. package/dist/components/session-mcp-capability-card.d.ts +22 -0
  52. package/dist/components/timeline-search.d.ts +34 -0
  53. package/dist/composer.js +7 -7
  54. package/dist/connect-account-identity.d.ts +8 -0
  55. package/dist/connect-accounts.d.ts +5 -0
  56. package/dist/connect-chooser.d.ts +6 -0
  57. package/dist/connect-panel.d.ts +9 -2
  58. package/dist/connect-setup.d.ts +5 -1
  59. package/dist/connect.d.ts +5 -21
  60. package/dist/connect.js +1268 -584
  61. package/dist/connect.js.map +1 -1
  62. package/dist/connection-catalog.d.ts +6 -1
  63. package/dist/connection-discovery.d.ts +12 -0
  64. package/dist/connection-installed.d.ts +1 -0
  65. package/dist/connection-logo.d.ts +5 -2
  66. package/dist/connection-service-logo.d.ts +8 -0
  67. package/dist/connection-service-presentation.d.ts +13 -0
  68. package/dist/connection-skeleton.d.ts +5 -0
  69. package/dist/discovery-cache.d.ts +5 -0
  70. package/dist/hooks/use-codex-accounts.d.ts +11 -5
  71. package/dist/hooks/use-connect.d.ts +22 -0
  72. package/dist/hooks/use-session-events.d.ts +5 -0
  73. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  74. package/dist/hooks/use-workspace-sessions.d.ts +2 -0
  75. package/dist/index.d.ts +8 -2
  76. package/dist/index.js +771 -793
  77. package/dist/index.js.map +1 -1
  78. package/dist/interaction.js +2 -2
  79. package/dist/machines.js +2 -2
  80. package/dist/mcp-connection-status.d.ts +14 -0
  81. package/dist/{model-policy-picker-menu-3R336DP2.js → model-policy-picker-menu-RVOQ4ZZG.js} +4 -4
  82. package/dist/model-policy.d.ts +6 -2
  83. package/dist/model-policy.js +1 -1
  84. package/dist/{platform-activity-row-DUE2W74J.js → platform-activity-row-HLOH7FW4.js} +9 -4
  85. package/dist/platform-activity-row-HLOH7FW4.js.map +1 -0
  86. package/dist/plugin-discovery.d.ts +6 -0
  87. package/dist/{queue-surface-implementation-LK3S4BIW.js → queue-surface-implementation-3RIFK2BS.js} +4 -4
  88. package/dist/realtime.js +22 -22
  89. package/dist/realtime.js.map +1 -1
  90. package/dist/session-auth-recommendation.d.ts +5 -0
  91. package/dist/session-capability-policy.d.ts +12 -0
  92. package/dist/session-ui.d.ts +2 -0
  93. package/dist/session-ui.js +14 -12
  94. package/dist/session.d.ts +1 -0
  95. package/dist/session.js +6 -4
  96. package/dist/skill-discovery.d.ts +11 -0
  97. package/dist/timeline/compaction-copy.d.ts +10 -0
  98. package/dist/timeline/projection.d.ts +3 -1
  99. package/dist/timeline/turn-summary.d.ts +2 -2
  100. package/dist/timeline/types.d.ts +22 -1
  101. package/dist/{timeline-annotation-markers-DRSTLEM6.js → timeline-annotation-markers-OY6OWR3V.js} +2 -2
  102. package/dist/{timeline-annotation-selection-IHLUGVND.js → timeline-annotation-selection-BOXA2TIN.js} +2 -2
  103. package/dist/{timeline-annotations-dialog-6Q53N5FG.js → timeline-annotations-dialog-RGY3MHL3.js} +3 -3
  104. package/package.json +3 -3
  105. package/src/assets/README.md +8 -0
  106. package/src/assets/gmail.ico +0 -0
  107. package/src/assets/outlook.ico +0 -0
  108. package/src/capability-catalog-row.tsx +94 -0
  109. package/src/capability-logo-fallback.ts +22 -0
  110. package/src/client.ts +0 -9
  111. package/src/components/artifacts/document-editor.tsx +63 -6
  112. package/src/components/artifacts/presentation-editor.tsx +214 -9
  113. package/src/components/artifacts/spreadsheet-canvas.ts +3 -8
  114. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  115. package/src/components/artifacts/spreadsheet-grid.tsx +10 -11
  116. package/src/components/chat-composer.tsx +26 -3
  117. package/src/components/composer.tsx +10 -4
  118. package/src/components/human-input-form.tsx +12 -2
  119. package/src/components/markdown.tsx +86 -4
  120. package/src/components/message-timeline.tsx +104 -36
  121. package/src/components/model-picker.tsx +11 -3
  122. package/src/components/model-policy-picker-menu.tsx +10 -3
  123. package/src/components/preview-loading.tsx +154 -0
  124. package/src/components/sandbox-workspace.tsx +20 -36
  125. package/src/components/session-capability-frame.tsx +163 -0
  126. package/src/components/session-chrome.tsx +46 -77
  127. package/src/components/session-commands.tsx +18 -0
  128. package/src/components/session-connection-request.tsx +97 -0
  129. package/src/components/session-conversation.tsx +5 -4
  130. package/src/components/session-mcp-capability-card.tsx +532 -0
  131. package/src/components/session-status.tsx +2 -2
  132. package/src/components/timeline-anchor.tsx +9 -8
  133. package/src/components/timeline-search.tsx +168 -0
  134. package/src/components/user-message-body.tsx +7 -0
  135. package/src/connect-account-identity.tsx +34 -0
  136. package/src/connect-accounts.tsx +114 -52
  137. package/src/connect-chooser.tsx +171 -39
  138. package/src/connect-panel.tsx +73 -9
  139. package/src/connect-setup.tsx +72 -25
  140. package/src/connect.ts +13 -22
  141. package/src/connection-assets.d.ts +4 -0
  142. package/src/connection-catalog.tsx +61 -39
  143. package/src/connection-discovery.tsx +235 -0
  144. package/src/connection-installed.tsx +2 -0
  145. package/src/connection-logo.tsx +18 -10
  146. package/src/connection-service-logo.tsx +55 -0
  147. package/src/connection-service-presentation.ts +46 -0
  148. package/src/connection-skeleton.tsx +16 -0
  149. package/src/conversation-timeline.ts +1 -0
  150. package/src/discovery-cache.ts +42 -0
  151. package/src/hooks/use-codex-accounts.ts +33 -14
  152. package/src/hooks/use-composer.ts +4 -5
  153. package/src/hooks/use-connect.ts +23 -0
  154. package/src/hooks/use-session-events.ts +114 -1
  155. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  156. package/src/hooks/use-workspace-sessions.ts +10 -0
  157. package/src/index.ts +22 -2
  158. package/src/mcp-connection-status.ts +35 -0
  159. package/src/model-policy.ts +21 -0
  160. package/src/plugin-details.tsx +8 -5
  161. package/src/plugin-discovery.tsx +92 -72
  162. package/src/realtime/realtime-control.tsx +6 -8
  163. package/src/session-auth-recommendation.ts +48 -0
  164. package/src/session-capability-policy.ts +83 -0
  165. package/src/session-ui.ts +2 -0
  166. package/src/session.ts +1 -0
  167. package/src/skill-discovery.tsx +101 -56
  168. package/src/timeline/compaction-copy.ts +40 -0
  169. package/src/timeline/platform-activity-row.tsx +8 -3
  170. package/src/timeline/projection.ts +74 -2
  171. package/src/timeline/shared.tsx +6 -1
  172. package/src/timeline/startup-timings.tsx +1 -1
  173. package/src/timeline/turn-summary.tsx +17 -3
  174. package/src/timeline/types.ts +22 -2
  175. package/styles/compiled.css +325 -27
  176. package/styles/connect.css +90 -15
  177. package/styles/index.css +46 -0
  178. package/styles/session-capability.css +42 -0
  179. package/dist/chunk-45XEUVTK.js.map +0 -1
  180. package/dist/chunk-HQV2I5HV.js +0 -124
  181. package/dist/chunk-HQV2I5HV.js.map +0 -1
  182. package/dist/chunk-HUIKIDM5.js.map +0 -1
  183. package/dist/chunk-ICA6R6TW.js.map +0 -1
  184. package/dist/chunk-IHQII5WO.js +0 -886
  185. package/dist/chunk-IHQII5WO.js.map +0 -1
  186. package/dist/chunk-KANFU34B.js.map +0 -1
  187. package/dist/chunk-L2NBTKRX.js.map +0 -1
  188. package/dist/chunk-NYESIADM.js.map +0 -1
  189. package/dist/chunk-PEI6RANI.js.map +0 -1
  190. package/dist/chunk-TDSEILUH.js.map +0 -1
  191. package/dist/chunk-UMECRJRV.js.map +0 -1
  192. package/dist/hooks/use-packs.d.ts +0 -32
  193. package/dist/platform-activity-row-DUE2W74J.js.map +0 -1
  194. package/src/hooks/use-packs.ts +0 -157
  195. /package/dist/{browser-viewer-NTD6UIPR.js.map → browser-viewer-LGH4IP47.js.map} +0 -0
  196. /package/dist/{chunk-NOSYBS2D.js.map → chunk-2VHARTBL.js.map} +0 -0
  197. /package/dist/{chunk-5M6VTFJ5.js.map → chunk-GBPCZH3Y.js.map} +0 -0
  198. /package/dist/{chunk-YBM6CQRU.js.map → chunk-GEN54DU5.js.map} +0 -0
  199. /package/dist/{chunk-R4KRSFGA.js.map → chunk-IP4BUBKH.js.map} +0 -0
  200. /package/dist/{chunk-NLTS7JHI.js.map → chunk-JPHDWKZE.js.map} +0 -0
  201. /package/dist/{chunk-24M4YBCL.js.map → chunk-PNAVEK2U.js.map} +0 -0
  202. /package/dist/{model-policy-picker-menu-3R336DP2.js.map → model-policy-picker-menu-RVOQ4ZZG.js.map} +0 -0
  203. /package/dist/{queue-surface-implementation-LK3S4BIW.js.map → queue-surface-implementation-3RIFK2BS.js.map} +0 -0
  204. /package/dist/{timeline-annotation-markers-DRSTLEM6.js.map → timeline-annotation-markers-OY6OWR3V.js.map} +0 -0
  205. /package/dist/{timeline-annotation-selection-IHLUGVND.js.map → timeline-annotation-selection-BOXA2TIN.js.map} +0 -0
  206. /package/dist/{timeline-annotations-dialog-6Q53N5FG.js.map → timeline-annotations-dialog-RGY3MHL3.js.map} +0 -0
@@ -37,6 +37,9 @@ var MAX_ZOOM = 4;
37
37
  var RAIL_ITEM_HEIGHT = 116;
38
38
  var RAIL_OVERSCAN = 3;
39
39
  var DEFAULT_RAIL_HEIGHT = 640;
40
+ var MOBILE_RAIL_ITEM_HEIGHT = 44;
41
+ var MOBILE_RAIL_OVERSCAN = 3;
42
+ var DEFAULT_MOBILE_LIST_HEIGHT = 264;
40
43
  var DEFAULT_VIEWPORT = { width: 960, height: 640 };
41
44
  var SPATIAL_TILE = 256;
42
45
  var MAX_SPATIAL_BUCKETS_PER_OBJECT = 1024;
@@ -87,6 +90,14 @@ function PresentationProjectionEditor({
87
90
  }
88
91
  );
89
92
  }
93
+ function nextSlideIndexFromKey(key, activeIndex, length) {
94
+ if (length === 0) return null;
95
+ if (key === "ArrowDown") return Math.min(length - 1, activeIndex + 1);
96
+ if (key === "ArrowUp") return Math.max(0, activeIndex - 1);
97
+ if (key === "Home") return 0;
98
+ if (key === "End") return length - 1;
99
+ return null;
100
+ }
90
101
  function PresentationEditorCore({
91
102
  presentation,
92
103
  revision,
@@ -125,6 +136,11 @@ function PresentationEditorCore({
125
136
  scrollTop: 0,
126
137
  height: DEFAULT_RAIL_HEIGHT
127
138
  });
139
+ const [mobileSelectorOpen, setMobileSelectorOpen] = useState(false);
140
+ const [mobileRail, setMobileRail] = useState({
141
+ scrollTop: 0,
142
+ height: DEFAULT_MOBILE_LIST_HEIGHT
143
+ });
128
144
  const [viewport, setViewport] = useState({
129
145
  scrollLeft: 0,
130
146
  scrollTop: 0,
@@ -137,6 +153,9 @@ function PresentationEditorCore({
137
153
  const [textDraft, setTextDraft] = useState("");
138
154
  const [paintEpoch, setPaintEpoch] = useState(0);
139
155
  const railRef = useRef(null);
156
+ const mobileSelectorTriggerRef = useRef(null);
157
+ const mobileSelectorPanelRef = useRef(null);
158
+ const mobileRailRef = useRef(null);
140
159
  const viewportRef = useRef(null);
141
160
  const stageRef = useRef(null);
142
161
  const canvasRef = useRef(null);
@@ -150,6 +169,7 @@ function PresentationEditorCore({
150
169
  const commandVersionsRef = useRef(/* @__PURE__ */ new Map());
151
170
  const pendingSlideIdRef = useRef(null);
152
171
  const pendingObjectIdRef = useRef(null);
172
+ const mobileRailScrollOnOpenRef = useRef(0);
153
173
  const domId = useId().replaceAll(":", "");
154
174
  const selectionProxyId = `${domId}-presentation-selection`;
155
175
  const instructionsId = `${domId}-presentation-instructions`;
@@ -208,6 +228,44 @@ function PresentationEditorCore({
208
228
  observer.observe(element);
209
229
  return () => observer.disconnect();
210
230
  }, []);
231
+ useLayoutEffect(() => {
232
+ if (!mobileSelectorOpen) return;
233
+ const element = mobileRailRef.current;
234
+ if (!element) return;
235
+ element.scrollTop = mobileRailScrollOnOpenRef.current;
236
+ element.focus();
237
+ const measure = () => setMobileRail((current) => ({
238
+ scrollTop: element.scrollTop,
239
+ height: element.clientHeight || current.height
240
+ }));
241
+ measure();
242
+ if (typeof ResizeObserver === "undefined") return;
243
+ const observer = new ResizeObserver(measure);
244
+ observer.observe(element);
245
+ return () => observer.disconnect();
246
+ }, [mobileSelectorOpen]);
247
+ useEffect(() => {
248
+ if (!mobileSelectorOpen) return;
249
+ const onPointerDown = (event) => {
250
+ const target = event.target;
251
+ if (!(target instanceof Node)) return;
252
+ if (mobileSelectorTriggerRef.current?.contains(target)) return;
253
+ if (mobileSelectorPanelRef.current?.contains(target)) return;
254
+ setMobileSelectorOpen(false);
255
+ };
256
+ const onKeyDown = (event) => {
257
+ if (event.key !== "Escape") return;
258
+ event.preventDefault();
259
+ setMobileSelectorOpen(false);
260
+ mobileSelectorTriggerRef.current?.focus();
261
+ };
262
+ document.addEventListener("pointerdown", onPointerDown);
263
+ document.addEventListener("keydown", onKeyDown);
264
+ return () => {
265
+ document.removeEventListener("pointerdown", onPointerDown);
266
+ document.removeEventListener("keydown", onKeyDown);
267
+ };
268
+ }, [mobileSelectorOpen]);
211
269
  useLayoutEffect(() => {
212
270
  const element = viewportRef.current;
213
271
  if (!element) return;
@@ -623,6 +681,32 @@ function PresentationEditorCore({
623
681
  },
624
682
  [activeIndex, activeSlide, selectSlide, slides]
625
683
  );
684
+ const toggleMobileSlideSelector = useCallback(() => {
685
+ setMobileSelectorOpen((open) => {
686
+ if (open) return false;
687
+ const index = Math.max(0, activeIndex);
688
+ const height = DEFAULT_MOBILE_LIST_HEIGHT;
689
+ const maxScroll = Math.max(0, slides.length * MOBILE_RAIL_ITEM_HEIGHT - height);
690
+ const scrollTop = Math.max(
691
+ 0,
692
+ Math.min(
693
+ maxScroll,
694
+ index * MOBILE_RAIL_ITEM_HEIGHT - height / 2 + MOBILE_RAIL_ITEM_HEIGHT / 2
695
+ )
696
+ );
697
+ mobileRailScrollOnOpenRef.current = scrollTop;
698
+ setMobileRail({ scrollTop, height });
699
+ return true;
700
+ });
701
+ }, [activeIndex, slides.length]);
702
+ const chooseMobileSlide = useCallback(
703
+ (slide, index) => {
704
+ if (slide !== activeSlide) selectSlide(slide, index);
705
+ setMobileSelectorOpen(false);
706
+ mobileSelectorTriggerRef.current?.focus();
707
+ },
708
+ [activeSlide, selectSlide]
709
+ );
626
710
  const handleCanvasKeyDown = useCallback(
627
711
  (event) => {
628
712
  if (event.metaKey || event.ctrlKey) {
@@ -784,6 +868,15 @@ function PresentationEditorCore({
784
868
  slides.length,
785
869
  Math.ceil((rail.scrollTop + rail.height) / RAIL_ITEM_HEIGHT) + RAIL_OVERSCAN
786
870
  );
871
+ const mobileRailStart = Math.max(
872
+ 0,
873
+ Math.floor(mobileRail.scrollTop / MOBILE_RAIL_ITEM_HEIGHT) - MOBILE_RAIL_OVERSCAN
874
+ );
875
+ const mobileRailEnd = Math.min(
876
+ slides.length,
877
+ Math.ceil((mobileRail.scrollTop + mobileRail.height) / MOBILE_RAIL_ITEM_HEIGHT) + MOBILE_RAIL_OVERSCAN
878
+ );
879
+ const slideCountLabel = activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}`;
787
880
  const stageWidth = presentation.slideSize.width * zoom;
788
881
  const stageHeight = presentation.slideSize.height * zoom;
789
882
  return /* @__PURE__ */ jsxs(
@@ -815,7 +908,23 @@ function PresentationEditorCore({
815
908
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, {})
816
909
  }
817
910
  ),
818
- /* @__PURE__ */ jsx("span", { className: "min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted", children: activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}` }),
911
+ /* @__PURE__ */ jsx(
912
+ "button",
913
+ {
914
+ ref: mobileSelectorTriggerRef,
915
+ type: "button",
916
+ "aria-label": "Choose slide",
917
+ "aria-haspopup": "listbox",
918
+ "aria-expanded": mobileSelectorOpen,
919
+ "aria-controls": mobileSelectorOpen ? `${domId}-mobile-slides` : void 0,
920
+ disabled: slides.length === 0,
921
+ "data-og-mobile-slide-selector": true,
922
+ onClick: toggleMobileSlideSelector,
923
+ className: "inline-flex min-h-11 min-w-16 shrink-0 items-center justify-center rounded-og-sm px-2 text-og-xs tabular-nums text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 sm:hidden",
924
+ children: /* @__PURE__ */ jsx("span", { children: slideCountLabel })
925
+ }
926
+ ),
927
+ /* @__PURE__ */ jsx("span", { className: "hidden min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted sm:inline", children: slideCountLabel }),
819
928
  /* @__PURE__ */ jsx(
820
929
  "button",
821
930
  {
@@ -920,7 +1029,7 @@ function PresentationEditorCore({
920
1029
  }
921
1030
  ),
922
1031
  /* @__PURE__ */ jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: commandFailure?.message ?? (pendingCommands > 0 ? "Saving presentation changes" : "") }),
923
- /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-1", children: [
1032
+ /* @__PURE__ */ jsxs("div", { className: "relative flex min-h-0 min-w-0 flex-1", children: [
924
1033
  /* @__PURE__ */ jsx(
925
1034
  "div",
926
1035
  {
@@ -943,12 +1052,7 @@ function PresentationEditorCore({
943
1052
  }));
944
1053
  },
945
1054
  onKeyDown: (event) => {
946
- if (slides.length === 0) return;
947
- let nextIndex = null;
948
- if (event.key === "ArrowDown") nextIndex = Math.min(slides.length - 1, activeIndex + 1);
949
- else if (event.key === "ArrowUp") nextIndex = Math.max(0, activeIndex - 1);
950
- else if (event.key === "Home") nextIndex = 0;
951
- else if (event.key === "End") nextIndex = slides.length - 1;
1055
+ const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);
952
1056
  if (nextIndex === null) return;
953
1057
  event.preventDefault();
954
1058
  const next = slides[nextIndex];
@@ -1001,6 +1105,96 @@ function PresentationEditorCore({
1001
1105
  }) })
1002
1106
  }
1003
1107
  ),
1108
+ mobileSelectorOpen ? /* @__PURE__ */ jsx(
1109
+ "div",
1110
+ {
1111
+ ref: mobileSelectorPanelRef,
1112
+ className: "absolute left-2 top-2 z-40 max-w-56 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 shadow-og-md sm:hidden",
1113
+ style: { width: "calc(100% - 1rem)" },
1114
+ children: /* @__PURE__ */ jsx(
1115
+ "div",
1116
+ {
1117
+ ref: mobileRailRef,
1118
+ id: `${domId}-mobile-slides`,
1119
+ role: "listbox",
1120
+ tabIndex: 0,
1121
+ "aria-label": "Slides",
1122
+ "aria-orientation": "vertical",
1123
+ "aria-activedescendant": activeSlide && activeIndex >= mobileRailStart && activeIndex < mobileRailEnd ? `${domId}-mobile-slide-${safeDomId(activeSlide.id)}` : void 0,
1124
+ className: "max-h-72 overflow-y-auto outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent",
1125
+ "data-og-mobile-slide-list": true,
1126
+ "data-og-window-start": mobileRailStart,
1127
+ "data-og-window-end": mobileRailEnd,
1128
+ onScroll: (event) => {
1129
+ const scrollTop = event.currentTarget.scrollTop;
1130
+ const height = event.currentTarget.clientHeight;
1131
+ setMobileRail((current) => ({
1132
+ scrollTop,
1133
+ height: height || current.height
1134
+ }));
1135
+ },
1136
+ onKeyDown: (event) => {
1137
+ if (event.key === "Escape") {
1138
+ event.preventDefault();
1139
+ setMobileSelectorOpen(false);
1140
+ mobileSelectorTriggerRef.current?.focus();
1141
+ return;
1142
+ }
1143
+ const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);
1144
+ if (nextIndex === null) return;
1145
+ event.preventDefault();
1146
+ const next = slides[nextIndex];
1147
+ if (!next) return;
1148
+ if (next !== activeSlide) selectSlide(next, nextIndex);
1149
+ const list = event.currentTarget;
1150
+ const top = nextIndex * MOBILE_RAIL_ITEM_HEIGHT;
1151
+ const bottom = top + MOBILE_RAIL_ITEM_HEIGHT;
1152
+ if (top < list.scrollTop) list.scrollTop = top;
1153
+ else if (bottom > list.scrollTop + list.clientHeight) {
1154
+ list.scrollTop = bottom - list.clientHeight;
1155
+ }
1156
+ },
1157
+ children: /* @__PURE__ */ jsx(
1158
+ "div",
1159
+ {
1160
+ className: "relative w-full",
1161
+ style: { height: slides.length * MOBILE_RAIL_ITEM_HEIGHT },
1162
+ children: slides.slice(mobileRailStart, mobileRailEnd).map((slide, offset) => {
1163
+ const index = mobileRailStart + offset;
1164
+ const active = slide === activeSlide;
1165
+ return /* @__PURE__ */ jsxs(
1166
+ "button",
1167
+ {
1168
+ id: `${domId}-mobile-slide-${safeDomId(slide.id)}`,
1169
+ type: "button",
1170
+ role: "option",
1171
+ tabIndex: -1,
1172
+ "aria-selected": active,
1173
+ "aria-label": `Slide ${index + 1}${slide.title ? `: ${slide.title}` : ""}`,
1174
+ onClick: () => chooseMobileSlide(slide, index),
1175
+ className: cn(
1176
+ "absolute left-0 flex min-h-11 w-full items-center gap-2 px-2 text-left",
1177
+ active ? "bg-og-surface-3 text-og-fg" : "text-og-fg-muted hover:bg-og-surface-3/70"
1178
+ ),
1179
+ style: {
1180
+ top: index * MOBILE_RAIL_ITEM_HEIGHT,
1181
+ height: MOBILE_RAIL_ITEM_HEIGHT
1182
+ },
1183
+ "data-og-mobile-slide-index": index,
1184
+ children: [
1185
+ /* @__PURE__ */ jsx("span", { className: "w-7 shrink-0 text-right text-og-xs tabular-nums text-og-fg-subtle", children: index + 1 }),
1186
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-og-sm", children: slide.title || `Slide ${index + 1}` })
1187
+ ]
1188
+ },
1189
+ slide.id
1190
+ );
1191
+ })
1192
+ }
1193
+ )
1194
+ }
1195
+ )
1196
+ }
1197
+ ) : null,
1004
1198
  /* @__PURE__ */ jsxs(
1005
1199
  "div",
1006
1200
  {
@@ -3231,4 +3425,4 @@ export {
3231
3425
  PresentationProjectionArtifactSurface,
3232
3426
  EditablePresentationArtifactSurface
3233
3427
  };
3234
- //# sourceMappingURL=chunk-PEI6RANI.js.map
3428
+ //# sourceMappingURL=chunk-VR4Z73EU.js.map