@abraca/nuxt 1.9.1 → 2.0.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.
- package/dist/module.d.mts +4 -3
- package/dist/module.json +1 -1
- package/dist/module.mjs +9 -1
- package/dist/runtime/components/ADocumentTree.vue +1 -1
- package/dist/runtime/components/AEditor.d.vue.ts +26 -1
- package/dist/runtime/components/AEditor.vue +153 -4
- package/dist/runtime/components/AEditor.vue.d.ts +26 -1
- package/dist/runtime/components/AIdentityModal.d.vue.ts +46 -0
- package/dist/runtime/components/AIdentityModal.vue +157 -0
- package/dist/runtime/components/AIdentityModal.vue.d.ts +46 -0
- package/dist/runtime/components/AMnemonicLoginModal.d.vue.ts +35 -0
- package/dist/runtime/components/AMnemonicLoginModal.vue +173 -0
- package/dist/runtime/components/AMnemonicLoginModal.vue.d.ts +35 -0
- package/dist/runtime/components/ANodePanel.d.vue.ts +29 -2
- package/dist/runtime/components/ANodePanel.vue +148 -27
- package/dist/runtime/components/ANodePanel.vue.d.ts +29 -2
- package/dist/runtime/components/ANodePanelHeader.d.vue.ts +64 -0
- package/dist/runtime/components/ANodePanelHeader.vue +105 -0
- package/dist/runtime/components/ANodePanelHeader.vue.d.ts +64 -0
- package/dist/runtime/components/ANodeSettingsPanel.d.vue.ts +49 -0
- package/dist/runtime/components/ANodeSettingsPanel.vue +59 -0
- package/dist/runtime/components/ANodeSettingsPanel.vue.d.ts +49 -0
- package/dist/runtime/components/ANotificationBell.d.vue.ts +26 -0
- package/dist/runtime/components/ANotificationBell.vue +55 -0
- package/dist/runtime/components/ANotificationBell.vue.d.ts +26 -0
- package/dist/runtime/components/AOfflineSync.d.vue.ts +11 -0
- package/dist/runtime/components/AOfflineSync.vue +217 -0
- package/dist/runtime/components/AOfflineSync.vue.d.ts +11 -0
- package/dist/runtime/components/ARecoveryPhraseDisplay.d.vue.ts +26 -0
- package/dist/runtime/components/ARecoveryPhraseDisplay.vue +94 -0
- package/dist/runtime/components/ARecoveryPhraseDisplay.vue.d.ts +26 -0
- package/dist/runtime/components/AServerInfoModal.d.vue.ts +43 -0
- package/dist/runtime/components/AServerInfoModal.vue +150 -0
- package/dist/runtime/components/AServerInfoModal.vue.d.ts +43 -0
- package/dist/runtime/components/ASpaceFormModal.vue +1 -1
- package/dist/runtime/components/aware/AAccordion.d.vue.ts +25 -0
- package/dist/runtime/components/aware/AAccordion.vue +107 -0
- package/dist/runtime/components/aware/AAccordion.vue.d.ts +25 -0
- package/dist/runtime/components/aware/AArea.vue +24 -11
- package/dist/runtime/components/aware/AAvatar.d.vue.ts +6 -0
- package/dist/runtime/components/aware/AAvatar.vue +33 -3
- package/dist/runtime/components/aware/AAvatar.vue.d.ts +6 -0
- package/dist/runtime/components/aware/AAvatarGroup.d.vue.ts +10 -0
- package/dist/runtime/components/aware/AAvatarGroup.vue +30 -0
- package/dist/runtime/components/aware/AAvatarGroup.vue.d.ts +10 -0
- package/dist/runtime/components/aware/AButton.d.vue.ts +4 -2
- package/dist/runtime/components/aware/AButton.vue +46 -14
- package/dist/runtime/components/aware/AButton.vue.d.ts +4 -2
- package/dist/runtime/components/aware/ACalendar.d.vue.ts +17 -0
- package/dist/runtime/components/aware/ACalendar.vue +145 -0
- package/dist/runtime/components/aware/ACalendar.vue.d.ts +17 -0
- package/dist/runtime/components/aware/ACarousel.d.vue.ts +25 -0
- package/dist/runtime/components/aware/ACarousel.vue +39 -0
- package/dist/runtime/components/aware/ACarousel.vue.d.ts +25 -0
- package/dist/runtime/components/aware/ACheckbox.d.vue.ts +11 -0
- package/dist/runtime/components/aware/ACheckbox.vue +74 -0
- package/dist/runtime/components/aware/ACheckbox.vue.d.ts +11 -0
- package/dist/runtime/components/aware/ACheckboxGroup.d.vue.ts +27 -0
- package/dist/runtime/components/aware/ACheckboxGroup.vue +79 -0
- package/dist/runtime/components/aware/ACheckboxGroup.vue.d.ts +27 -0
- package/dist/runtime/components/aware/ACollapsible.d.vue.ts +25 -0
- package/dist/runtime/components/aware/ACollapsible.vue +45 -0
- package/dist/runtime/components/aware/ACollapsible.vue.d.ts +25 -0
- package/dist/runtime/components/aware/AColorPicker.d.vue.ts +15 -0
- package/dist/runtime/components/aware/AColorPicker.vue +48 -0
- package/dist/runtime/components/aware/AColorPicker.vue.d.ts +15 -0
- package/dist/runtime/components/aware/ACommandPalette.d.vue.ts +33 -0
- package/dist/runtime/components/aware/ACommandPalette.vue +123 -0
- package/dist/runtime/components/aware/ACommandPalette.vue.d.ts +33 -0
- package/dist/runtime/components/aware/AContextMenu.d.vue.ts +25 -0
- package/dist/runtime/components/aware/AContextMenu.vue +63 -0
- package/dist/runtime/components/aware/AContextMenu.vue.d.ts +25 -0
- package/dist/runtime/components/aware/ADrawer.d.vue.ts +25 -0
- package/dist/runtime/components/aware/ADrawer.vue +57 -0
- package/dist/runtime/components/aware/ADrawer.vue.d.ts +25 -0
- package/dist/runtime/components/aware/ADropdownMenu.d.vue.ts +25 -0
- package/dist/runtime/components/aware/ADropdownMenu.vue +63 -0
- package/dist/runtime/components/aware/ADropdownMenu.vue.d.ts +25 -0
- package/dist/runtime/components/aware/AFileUpload.d.vue.ts +27 -0
- package/dist/runtime/components/aware/AFileUpload.vue +67 -0
- package/dist/runtime/components/aware/AFileUpload.vue.d.ts +27 -0
- package/dist/runtime/components/aware/AFollowBar.d.vue.ts +21 -0
- package/dist/runtime/components/aware/AFollowBar.vue +62 -0
- package/dist/runtime/components/aware/AFollowBar.vue.d.ts +21 -0
- package/dist/runtime/components/aware/AFollowScroll.d.vue.ts +7 -0
- package/dist/runtime/components/aware/AFollowScroll.vue +17 -0
- package/dist/runtime/components/aware/AFollowScroll.vue.d.ts +7 -0
- package/dist/runtime/components/aware/AFormSync.d.vue.ts +21 -0
- package/dist/runtime/components/aware/AFormSync.vue +52 -0
- package/dist/runtime/components/aware/AFormSync.vue.d.ts +21 -0
- package/dist/runtime/components/aware/AGlobalFocusLayer.d.vue.ts +3 -0
- package/dist/runtime/components/aware/AGlobalFocusLayer.vue +90 -0
- package/dist/runtime/components/aware/AGlobalFocusLayer.vue.d.ts +3 -0
- package/dist/runtime/components/aware/AHoverItem.d.vue.ts +27 -0
- package/dist/runtime/components/aware/AHoverItem.vue +124 -0
- package/dist/runtime/components/aware/AHoverItem.vue.d.ts +27 -0
- package/dist/runtime/components/aware/AInput.d.vue.ts +12 -2
- package/dist/runtime/components/aware/AInput.vue +72 -19
- package/dist/runtime/components/aware/AInput.vue.d.ts +12 -2
- package/dist/runtime/components/aware/AInputMenu.d.vue.ts +17 -0
- package/dist/runtime/components/aware/AInputMenu.vue +138 -0
- package/dist/runtime/components/aware/AInputMenu.vue.d.ts +17 -0
- package/dist/runtime/components/aware/AInputNumber.d.vue.ts +15 -0
- package/dist/runtime/components/aware/AInputNumber.vue +67 -0
- package/dist/runtime/components/aware/AInputNumber.vue.d.ts +15 -0
- package/dist/runtime/components/aware/AInputTags.d.vue.ts +15 -0
- package/dist/runtime/components/aware/AInputTags.vue +67 -0
- package/dist/runtime/components/aware/AInputTags.vue.d.ts +15 -0
- package/dist/runtime/components/aware/AKeyHint.d.vue.ts +3 -0
- package/dist/runtime/components/aware/AKeyHint.vue +23 -0
- package/dist/runtime/components/aware/AKeyHint.vue.d.ts +3 -0
- package/dist/runtime/components/aware/AMedia.d.vue.ts +19 -0
- package/dist/runtime/components/aware/AMedia.vue +85 -0
- package/dist/runtime/components/aware/AMedia.vue.d.ts +19 -0
- package/dist/runtime/components/aware/AModal.d.vue.ts +33 -0
- package/dist/runtime/components/aware/AModal.vue +110 -0
- package/dist/runtime/components/aware/AModal.vue.d.ts +33 -0
- package/dist/runtime/components/aware/ANavigationMenu.d.vue.ts +25 -0
- package/dist/runtime/components/aware/ANavigationMenu.vue +82 -0
- package/dist/runtime/components/aware/ANavigationMenu.vue.d.ts +25 -0
- package/dist/runtime/components/aware/APagination.d.vue.ts +13 -0
- package/dist/runtime/components/aware/APagination.vue +53 -0
- package/dist/runtime/components/aware/APagination.vue.d.ts +13 -0
- package/dist/runtime/components/aware/APeerCaretLayer.d.vue.ts +10 -0
- package/dist/runtime/components/aware/APeerCaretLayer.vue +133 -0
- package/dist/runtime/components/aware/APeerCaretLayer.vue.d.ts +10 -0
- package/dist/runtime/components/aware/APinInput.d.vue.ts +15 -0
- package/dist/runtime/components/aware/APinInput.vue +48 -0
- package/dist/runtime/components/aware/APinInput.vue.d.ts +15 -0
- package/dist/runtime/components/aware/APopover.d.vue.ts +25 -0
- package/dist/runtime/components/aware/APopover.vue +57 -0
- package/dist/runtime/components/aware/APopover.vue.d.ts +25 -0
- package/dist/runtime/components/aware/APresenceBlobs.d.vue.ts +3 -0
- package/dist/runtime/components/aware/APresenceBlobs.vue +69 -0
- package/dist/runtime/components/aware/APresenceBlobs.vue.d.ts +3 -0
- package/dist/runtime/components/aware/APresenceCursors.d.vue.ts +20 -0
- package/dist/runtime/components/aware/APresenceCursors.vue +47 -0
- package/dist/runtime/components/aware/APresenceCursors.vue.d.ts +20 -0
- package/dist/runtime/components/aware/ARadioGroup.d.vue.ts +27 -0
- package/dist/runtime/components/aware/ARadioGroup.vue +86 -0
- package/dist/runtime/components/aware/ARadioGroup.vue.d.ts +27 -0
- package/dist/runtime/components/aware/AScroll.d.vue.ts +25 -0
- package/dist/runtime/components/aware/AScroll.vue +87 -0
- package/dist/runtime/components/aware/AScroll.vue.d.ts +25 -0
- package/dist/runtime/components/aware/ASelect.d.vue.ts +12 -2
- package/dist/runtime/components/aware/ASelect.vue +146 -22
- package/dist/runtime/components/aware/ASelect.vue.d.ts +12 -2
- package/dist/runtime/components/aware/ASelectMenu.d.vue.ts +17 -0
- package/dist/runtime/components/aware/ASelectMenu.vue +139 -0
- package/dist/runtime/components/aware/ASelectMenu.vue.d.ts +17 -0
- package/dist/runtime/components/aware/ASlideover.d.vue.ts +33 -0
- package/dist/runtime/components/aware/ASlideover.vue +110 -0
- package/dist/runtime/components/aware/ASlideover.vue.d.ts +33 -0
- package/dist/runtime/components/aware/ASlider.d.vue.ts +19 -0
- package/dist/runtime/components/aware/ASlider.vue +77 -0
- package/dist/runtime/components/aware/ASlider.vue.d.ts +19 -0
- package/dist/runtime/components/aware/AStepper.d.vue.ts +25 -0
- package/dist/runtime/components/aware/AStepper.vue +82 -0
- package/dist/runtime/components/aware/AStepper.vue.d.ts +25 -0
- package/dist/runtime/components/aware/ASwitch.d.vue.ts +11 -0
- package/dist/runtime/components/aware/ASwitch.vue +75 -0
- package/dist/runtime/components/aware/ASwitch.vue.d.ts +11 -0
- package/dist/runtime/components/aware/ATable.d.vue.ts +23 -0
- package/dist/runtime/components/aware/ATable.vue +97 -0
- package/dist/runtime/components/aware/ATable.vue.d.ts +23 -0
- package/dist/runtime/components/aware/ATabs.d.vue.ts +27 -0
- package/dist/runtime/components/aware/ATabs.vue +128 -0
- package/dist/runtime/components/aware/ATabs.vue.d.ts +27 -0
- package/dist/runtime/components/aware/ATextarea.d.vue.ts +12 -2
- package/dist/runtime/components/aware/ATextarea.vue +72 -19
- package/dist/runtime/components/aware/ATextarea.vue.d.ts +12 -2
- package/dist/runtime/components/aware/AToggleGroup.d.vue.ts +27 -0
- package/dist/runtime/components/aware/AToggleGroup.vue +79 -0
- package/dist/runtime/components/aware/AToggleGroup.vue.d.ts +27 -0
- package/dist/runtime/components/aware/ATree.d.vue.ts +27 -0
- package/dist/runtime/components/aware/ATree.vue +111 -0
- package/dist/runtime/components/aware/ATree.vue.d.ts +27 -0
- package/dist/runtime/components/chat/AChatPanel.d.vue.ts +6 -6
- package/dist/runtime/components/chat/AChatPanel.vue.d.ts +6 -6
- package/dist/runtime/components/chat/ANodeChatPanel.d.vue.ts +42 -0
- package/dist/runtime/components/chat/ANodeChatPanel.vue +53 -0
- package/dist/runtime/components/chat/ANodeChatPanel.vue.d.ts +42 -0
- package/dist/runtime/components/docs/ADocsSearch.d.vue.ts +2 -2
- package/dist/runtime/components/docs/ADocsSearch.vue.d.ts +2 -2
- package/dist/runtime/components/docs/ADocsSearchButton.d.vue.ts +3 -3
- package/dist/runtime/components/docs/ADocsSearchButton.vue.d.ts +3 -3
- package/dist/runtime/components/editor/AEditorRedoButton.d.vue.ts +26 -0
- package/dist/runtime/components/editor/AEditorRedoButton.vue +38 -0
- package/dist/runtime/components/editor/AEditorRedoButton.vue.d.ts +26 -0
- package/dist/runtime/components/editor/AEditorUndoButton.d.vue.ts +26 -0
- package/dist/runtime/components/editor/AEditorUndoButton.vue +38 -0
- package/dist/runtime/components/editor/AEditorUndoButton.vue.d.ts +26 -0
- package/dist/runtime/components/editor/AIconPickerPopover.d.vue.ts +24 -0
- package/dist/runtime/components/editor/AIconPickerPopover.vue +113 -0
- package/dist/runtime/components/editor/AIconPickerPopover.vue.d.ts +24 -0
- package/dist/runtime/components/editor/ANodeInlineLabel.d.vue.ts +24 -0
- package/dist/runtime/components/editor/ANodeInlineLabel.vue +101 -0
- package/dist/runtime/components/editor/ANodeInlineLabel.vue.d.ts +24 -0
- package/dist/runtime/components/renderers/ADocLoadError.d.vue.ts +3 -0
- package/dist/runtime/components/renderers/ADocLoadError.vue +11 -0
- package/dist/runtime/components/renderers/ADocLoadError.vue.d.ts +3 -0
- package/dist/runtime/components/renderers/ADocLoadingSkeleton.d.vue.ts +3 -0
- package/dist/runtime/components/renderers/ADocLoadingSkeleton.vue +5 -0
- package/dist/runtime/components/renderers/ADocLoadingSkeleton.vue.d.ts +3 -0
- package/dist/runtime/components/renderers/AOverviewRenderer.d.vue.ts +22 -0
- package/dist/runtime/components/renderers/AOverviewRenderer.vue +1041 -0
- package/dist/runtime/components/renderers/AOverviewRenderer.vue.d.ts +22 -0
- package/dist/runtime/components/renderers/AProseRenderer.d.vue.ts +23 -0
- package/dist/runtime/components/renderers/AProseRenderer.vue +31 -0
- package/dist/runtime/components/renderers/AProseRenderer.vue.d.ts +23 -0
- package/dist/runtime/components/renderers/ASheetsRenderer.client.d.vue.ts +19 -0
- package/dist/runtime/components/renderers/ASheetsRenderer.client.vue +865 -0
- package/dist/runtime/components/renderers/ASheetsRenderer.client.vue.d.ts +19 -0
- package/dist/runtime/components/renderers/calendar/ACalendarDayCell.d.vue.ts +14 -0
- package/dist/runtime/components/renderers/calendar/ACalendarDayCell.vue +45 -15
- package/dist/runtime/components/renderers/calendar/ACalendarDayCell.vue.d.ts +14 -0
- package/dist/runtime/components/renderers/calendar/ACalendarDayView.d.vue.ts +15 -0
- package/dist/runtime/components/renderers/calendar/ACalendarDayView.vue +93 -20
- package/dist/runtime/components/renderers/calendar/ACalendarDayView.vue.d.ts +15 -0
- package/dist/runtime/components/renderers/calendar/ACalendarEventChip.d.vue.ts +9 -0
- package/dist/runtime/components/renderers/calendar/ACalendarEventChip.vue +31 -2
- package/dist/runtime/components/renderers/calendar/ACalendarEventChip.vue.d.ts +9 -0
- package/dist/runtime/components/renderers/calendar/ACalendarToolbar.d.vue.ts +4 -4
- package/dist/runtime/components/renderers/calendar/ACalendarToolbar.vue.d.ts +4 -4
- package/dist/runtime/components/renderers/calendar/ACalendarWeekView.d.vue.ts +15 -0
- package/dist/runtime/components/renderers/calendar/ACalendarWeekView.vue +94 -21
- package/dist/runtime/components/renderers/calendar/ACalendarWeekView.vue.d.ts +15 -0
- package/dist/runtime/components/renderers/media/MediaTransportBar.d.vue.ts +2 -2
- package/dist/runtime/components/renderers/media/MediaTransportBar.vue.d.ts +2 -2
- package/dist/runtime/components/renderers/sheets/ASheetsCell.d.vue.ts +45 -0
- package/dist/runtime/components/renderers/sheets/ASheetsCell.vue +123 -0
- package/dist/runtime/components/renderers/sheets/ASheetsCell.vue.d.ts +45 -0
- package/dist/runtime/components/renderers/sheets/ASheetsGrid.d.vue.ts +111 -0
- package/dist/runtime/components/renderers/sheets/ASheetsGrid.vue +737 -0
- package/dist/runtime/components/renderers/sheets/ASheetsGrid.vue.d.ts +111 -0
- package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.d.vue.ts +26 -0
- package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.vue +100 -0
- package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.vue.d.ts +26 -0
- package/dist/runtime/components/renderers/sheets/ASheetsToolbar.d.vue.ts +48 -0
- package/dist/runtime/components/renderers/sheets/ASheetsToolbar.vue +243 -0
- package/dist/runtime/components/renderers/sheets/ASheetsToolbar.vue.d.ts +48 -0
- package/dist/runtime/components/renderers/table/cells/ATableCellColor.d.vue.ts +1 -0
- package/dist/runtime/components/renderers/table/cells/ATableCellColor.vue +13 -32
- package/dist/runtime/components/renderers/table/cells/ATableCellColor.vue.d.ts +1 -0
- package/dist/runtime/components/renderers/timeline/ATimelineBar.d.vue.ts +6 -0
- package/dist/runtime/components/renderers/timeline/ATimelineBar.vue +34 -4
- package/dist/runtime/components/renderers/timeline/ATimelineBar.vue.d.ts +6 -0
- package/dist/runtime/components/renderers/timeline/ATimelineBarArea.d.vue.ts +16 -0
- package/dist/runtime/components/renderers/timeline/ATimelineBarArea.vue +14 -3
- package/dist/runtime/components/renderers/timeline/ATimelineBarArea.vue.d.ts +16 -0
- package/dist/runtime/components/renderers/timeline/ATimelineLabelPanel.d.vue.ts +13 -1
- package/dist/runtime/components/renderers/timeline/ATimelineLabelPanel.vue +114 -47
- package/dist/runtime/components/renderers/timeline/ATimelineLabelPanel.vue.d.ts +13 -1
- package/dist/runtime/components/renderers/timeline/ATimelineMilestone.d.vue.ts +4 -0
- package/dist/runtime/components/renderers/timeline/ATimelineMilestone.vue +21 -4
- package/dist/runtime/components/renderers/timeline/ATimelineMilestone.vue.d.ts +4 -0
- package/dist/runtime/components/renderers/timeline/ATimelineToolbar.d.vue.ts +2 -2
- package/dist/runtime/components/renderers/timeline/ATimelineToolbar.vue.d.ts +2 -2
- package/dist/runtime/components/settings/ASettingsSpacesPanel.vue +7 -25
- package/dist/runtime/components/shell/ADocPanelSettings.d.vue.ts +3 -3
- package/dist/runtime/components/shell/ADocPanelSettings.vue.d.ts +3 -3
- package/dist/runtime/components/shell/ASyncStatus.d.vue.ts +1 -1
- package/dist/runtime/components/shell/ASyncStatus.vue.d.ts +1 -1
- package/dist/runtime/components/shell/AUserMenu.d.vue.ts +2 -2
- package/dist/runtime/components/shell/AUserMenu.vue.d.ts +2 -2
- package/dist/runtime/components/shell/AWelcomeScreen.d.vue.ts +1 -1
- package/dist/runtime/components/shell/AWelcomeScreen.vue.d.ts +1 -1
- package/dist/runtime/composables/useAACaret.d.ts +29 -0
- package/dist/runtime/composables/useAACaret.js +64 -0
- package/dist/runtime/composables/useAAEphemeral.d.ts +32 -0
- package/dist/runtime/composables/useAAEphemeral.js +33 -0
- package/dist/runtime/composables/useAAField.d.ts +10 -2
- package/dist/runtime/composables/useAAField.js +31 -2
- package/dist/runtime/composables/useAAFieldValue.d.ts +26 -0
- package/dist/runtime/composables/useAAFieldValue.js +32 -0
- package/dist/runtime/composables/useAAFocus.d.ts +68 -0
- package/dist/runtime/composables/useAAFocus.js +174 -0
- package/dist/runtime/composables/useAAFollowAnchor.d.ts +25 -0
- package/dist/runtime/composables/useAAFollowAnchor.js +69 -0
- package/dist/runtime/composables/useAAFollowPeer.d.ts +29 -0
- package/dist/runtime/composables/useAAFollowPeer.js +75 -0
- package/dist/runtime/composables/useAAKey.d.ts +22 -0
- package/dist/runtime/composables/useAAKey.js +24 -0
- package/dist/runtime/composables/useAAPointer.d.ts +30 -0
- package/dist/runtime/composables/useAAPointer.js +53 -0
- package/dist/runtime/composables/useAAUIState.d.ts +29 -0
- package/dist/runtime/composables/useAAUIState.js +28 -0
- package/dist/runtime/composables/useAAViewport.d.ts +22 -0
- package/dist/runtime/composables/useAAViewport.js +50 -0
- package/dist/runtime/composables/useAbraAdmin.d.ts +54 -0
- package/dist/runtime/composables/useAbraAdmin.js +115 -0
- package/dist/runtime/composables/useAbracadabraAuth.d.ts +8 -0
- package/dist/runtime/composables/useAbracadabraAuth.js +8 -0
- package/dist/runtime/composables/useAggregatedPresence.d.ts +23 -0
- package/dist/runtime/composables/useAggregatedPresence.js +140 -0
- package/dist/runtime/composables/useChat.d.ts +16 -2
- package/dist/runtime/composables/useChat.js +257 -66
- package/dist/runtime/composables/useChatUsers.d.ts +2 -0
- package/dist/runtime/composables/useChatUsers.js +2 -1
- package/dist/runtime/composables/useDocLookup.d.ts +4 -0
- package/dist/runtime/composables/useDocLookup.js +25 -0
- package/dist/runtime/composables/useDocSnapshots.d.ts +79 -0
- package/dist/runtime/composables/useDocSnapshots.js +234 -0
- package/dist/runtime/composables/useEditorDragHandle.d.ts +7 -0
- package/dist/runtime/composables/useEditorDragHandle.js +19 -1
- package/dist/runtime/composables/useEditorSuggestions.js +26 -1
- package/dist/runtime/composables/useEditorToolbar.js +9 -1
- package/dist/runtime/composables/useEmailVerification.d.ts +33 -0
- package/dist/runtime/composables/useEmailVerification.js +58 -0
- package/dist/runtime/composables/useIdentityDoc.js +0 -3
- package/dist/runtime/composables/useItemPresence.d.ts +47 -0
- package/dist/runtime/composables/useItemPresence.js +73 -0
- package/dist/runtime/composables/useResizableWidth.d.ts +24 -0
- package/dist/runtime/composables/useResizableWidth.js +87 -0
- package/dist/runtime/composables/useServerInfo.d.ts +17 -2
- package/dist/runtime/composables/useServerInfo.js +30 -6
- package/dist/runtime/composables/useServerSearch.d.ts +36 -0
- package/dist/runtime/composables/useServerSearch.js +91 -0
- package/dist/runtime/composables/useServerTrash.d.ts +67 -0
- package/dist/runtime/composables/useServerTrash.js +128 -0
- package/dist/runtime/composables/useSheetsClipboard.d.ts +42 -0
- package/dist/runtime/composables/useSheetsClipboard.js +109 -0
- package/dist/runtime/composables/useSheetsFormulas.d.ts +38 -0
- package/dist/runtime/composables/useSheetsFormulas.js +725 -0
- package/dist/runtime/composables/useSheetsSelection.d.ts +68 -0
- package/dist/runtime/composables/useSheetsSelection.js +390 -0
- package/dist/runtime/composables/useSheetsView.d.ts +31 -0
- package/dist/runtime/composables/useSheetsView.js +77 -0
- package/dist/runtime/composables/useSpaceConnections.d.ts +43 -0
- package/dist/runtime/composables/useSpaceConnections.js +72 -0
- package/dist/runtime/composables/useSpaces.d.ts +1 -3
- package/dist/runtime/composables/useSpaces.js +2 -5
- package/dist/runtime/composables/useTiptapHistory.d.ts +22 -0
- package/dist/runtime/composables/useTiptapHistory.js +12 -0
- package/dist/runtime/composables/useTreeExpansion.d.ts +28 -0
- package/dist/runtime/composables/useTreeExpansion.js +94 -0
- package/dist/runtime/composables/useYDoc.js +12 -1
- package/dist/runtime/extensions/button.d.ts +3 -0
- package/dist/runtime/extensions/button.js +62 -0
- package/dist/runtime/extensions/color-swatch.d.ts +2 -0
- package/dist/runtime/extensions/color-swatch.js +34 -0
- package/dist/runtime/extensions/diff.d.ts +2 -0
- package/dist/runtime/extensions/diff.js +40 -0
- package/dist/runtime/extensions/divider.d.ts +2 -0
- package/dist/runtime/extensions/divider.js +33 -0
- package/dist/runtime/extensions/embed.d.ts +2 -0
- package/dist/runtime/extensions/embed.js +40 -0
- package/dist/runtime/extensions/figure.d.ts +2 -0
- package/dist/runtime/extensions/figure.js +49 -0
- package/dist/runtime/extensions/math.d.ts +15 -0
- package/dist/runtime/extensions/math.js +66 -0
- package/dist/runtime/extensions/progress.d.ts +2 -0
- package/dist/runtime/extensions/progress.js +43 -0
- package/dist/runtime/extensions/quote.d.ts +2 -0
- package/dist/runtime/extensions/quote.js +39 -0
- package/dist/runtime/extensions/spoiler.d.ts +2 -0
- package/dist/runtime/extensions/spoiler.js +36 -0
- package/dist/runtime/extensions/stat.d.ts +3 -0
- package/dist/runtime/extensions/stat.js +58 -0
- package/dist/runtime/extensions/video.d.ts +2 -0
- package/dist/runtime/extensions/video.js +40 -0
- package/dist/runtime/extensions/views/ButtonGroupView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/ButtonGroupView.vue +25 -0
- package/dist/runtime/extensions/views/ButtonGroupView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/ButtonView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/ButtonView.vue +171 -0
- package/dist/runtime/extensions/views/ButtonView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/ColorSwatchView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/ColorSwatchView.vue +134 -0
- package/dist/runtime/extensions/views/ColorSwatchView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/DiffView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/DiffView.vue +163 -0
- package/dist/runtime/extensions/views/DiffView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/DividerView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/DividerView.vue +40 -0
- package/dist/runtime/extensions/views/DividerView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/EmbedView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/EmbedView.vue +166 -0
- package/dist/runtime/extensions/views/EmbedView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/FigureView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/FigureView.vue +122 -0
- package/dist/runtime/extensions/views/FigureView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/FileNodeView.vue +21 -24
- package/dist/runtime/extensions/views/MathBlockView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/MathBlockView.vue +151 -0
- package/dist/runtime/extensions/views/MathBlockView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/MathInlineView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/MathInlineView.vue +149 -0
- package/dist/runtime/extensions/views/MathInlineView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/MetaFieldView.vue +1129 -550
- package/dist/runtime/extensions/views/ProgressView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/ProgressView.vue +156 -0
- package/dist/runtime/extensions/views/ProgressView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/QuoteView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/QuoteView.vue +128 -0
- package/dist/runtime/extensions/views/QuoteView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/SpoilerView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/SpoilerView.vue +62 -0
- package/dist/runtime/extensions/views/SpoilerView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/StatGroupView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/StatGroupView.vue +25 -0
- package/dist/runtime/extensions/views/StatGroupView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/StatView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/StatView.vue +89 -0
- package/dist/runtime/extensions/views/StatView.vue.d.ts +4 -0
- package/dist/runtime/extensions/views/VideoView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/VideoView.vue +190 -0
- package/dist/runtime/extensions/views/VideoView.vue.d.ts +4 -0
- package/dist/runtime/locale.d.ts +133 -0
- package/dist/runtime/locale.js +121 -2
- package/dist/runtime/plugin-abracadabra.client.js +233 -36
- package/dist/runtime/plugin-abracadabra.server.js +0 -1
- package/dist/runtime/plugins/core.plugin.js +73 -4
- package/dist/runtime/server/plugins/abracadabra-service.js +1 -1
- package/dist/runtime/server/utils/rpcHandler.d.ts +74 -0
- package/dist/runtime/server/utils/rpcHandler.js +74 -0
- package/dist/runtime/server/utils/spaceManager.js +10 -9
- package/dist/runtime/types.d.ts +63 -10
- package/dist/runtime/utils/awareRingStyle.d.ts +22 -0
- package/dist/runtime/utils/awareRingStyle.js +16 -0
- package/dist/runtime/utils/caretCoordinates.d.ts +41 -0
- package/dist/runtime/utils/caretCoordinates.js +126 -0
- package/dist/runtime/utils/content.d.ts +1 -1
- package/dist/runtime/utils/docTypes.js +44 -13
- package/dist/runtime/utils/domPath.d.ts +42 -0
- package/dist/runtime/utils/domPath.js +89 -0
- package/dist/runtime/utils/loadKatex.d.ts +1 -0
- package/dist/runtime/utils/loadKatex.js +29 -0
- package/dist/runtime/utils/lucideIcons.d.ts +16 -0
- package/dist/runtime/utils/lucideIcons.js +451 -0
- package/dist/runtime/utils/time.d.ts +15 -0
- package/dist/runtime/utils/time.js +5 -0
- package/dist/types.d.mts +4 -0
- package/package.json +27 -16
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type DomPath } from '../utils/domPath.js';
|
|
2
|
+
/**
|
|
3
|
+
* App-wide "focus" broadcast for collaborative awareness.
|
|
4
|
+
*
|
|
5
|
+
* Emits a single per-peer `peer:aa:focus` slot describing where the local
|
|
6
|
+
* user is currently looking. Two payload shapes share the same slot so
|
|
7
|
+
* downstream consumers (text-selection layer, smart scroll-follow) can pick
|
|
8
|
+
* the one they care about:
|
|
9
|
+
*
|
|
10
|
+
* { kind: 'selection', route, start: DomPath, end: DomPath }
|
|
11
|
+
* { kind: 'anchor', route, anchor: DomPath }
|
|
12
|
+
*
|
|
13
|
+
* Selection takes precedence: if the user has a non-empty Selection the
|
|
14
|
+
* payload describes its endpoints; otherwise the payload anchors on the
|
|
15
|
+
* topmost scroll-visible element near the viewport top edge so that smart
|
|
16
|
+
* follow can centre the same conceptual region on a different-sized screen.
|
|
17
|
+
*
|
|
18
|
+
* The `route` discriminator scopes the payload — peers on different pages
|
|
19
|
+
* don't try to interpret each other's anchors. Other tabs only honour
|
|
20
|
+
* payloads whose route matches their own.
|
|
21
|
+
*/
|
|
22
|
+
/** Per-scroller anchor: identifies WHICH scroll container the anchor lives
|
|
23
|
+
* inside (by its DOM path, or omitted for window) plus the element that's
|
|
24
|
+
* currently top-visible inside that container and where it sits vertically.
|
|
25
|
+
* Each scrollable container the leader has — main viewport, sidebar,
|
|
26
|
+
* modal body, etc. — gets its own entry, so the follower can re-scroll
|
|
27
|
+
* each local container independently. */
|
|
28
|
+
export interface AAScrollAnchor {
|
|
29
|
+
/** Path to the scroll container element. Omitted = window/document. */
|
|
30
|
+
containerPath?: number[];
|
|
31
|
+
/** Path to the topmost-visible element inside that container. */
|
|
32
|
+
elementPath: number[];
|
|
33
|
+
/** Vertical position of the element relative to its container's viewport
|
|
34
|
+
* (0 = top edge of container, 1 = bottom edge). */
|
|
35
|
+
ratio: number;
|
|
36
|
+
}
|
|
37
|
+
/** Element-anchored pointer: stores WHICH element the cursor is over plus
|
|
38
|
+
* the offset within its bounding box. Receivers reconstruct the absolute
|
|
39
|
+
* viewport position by looking up the same element in their own DOM and
|
|
40
|
+
* adding the offset. Survives different scroll positions and viewport
|
|
41
|
+
* sizes without falling out of sync. */
|
|
42
|
+
export interface AAPointerAnchor {
|
|
43
|
+
elementPath: number[];
|
|
44
|
+
/** Offset from the element's top-left, in CSS pixels. */
|
|
45
|
+
dx: number;
|
|
46
|
+
dy: number;
|
|
47
|
+
}
|
|
48
|
+
export interface AAFocusPayload {
|
|
49
|
+
kind: 'selection' | 'anchor';
|
|
50
|
+
route: string;
|
|
51
|
+
start?: DomPath;
|
|
52
|
+
end?: DomPath;
|
|
53
|
+
/** Legacy single-anchor field (main viewport). Retained for backwards
|
|
54
|
+
* compatibility with older follower clients; prefer reading `scrollers`. */
|
|
55
|
+
anchor?: DomPath;
|
|
56
|
+
anchorRatio?: number;
|
|
57
|
+
/** All scrollable containers the leader has, with their top-visible
|
|
58
|
+
* anchor each. Lets the follower drive every scroller (main, sidebar,
|
|
59
|
+
* modal, etc.) in step instead of just the main viewport. */
|
|
60
|
+
scrollers?: AAScrollAnchor[];
|
|
61
|
+
/** Element-anchored pointer position (path + offset within element). The
|
|
62
|
+
* blob layer uses this to render the peer's mouse glow at the same
|
|
63
|
+
* *content* position regardless of either tab's scroll state. */
|
|
64
|
+
pointer?: AAPointerAnchor;
|
|
65
|
+
}
|
|
66
|
+
export declare function useAAFocus(): {
|
|
67
|
+
snapshot: () => void;
|
|
68
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { onMounted, onScopeDispose } from "vue";
|
|
2
|
+
import { useRoute } from "#imports";
|
|
3
|
+
import { useAAEphemeral } from "./useAAEphemeral.js";
|
|
4
|
+
import { serializeRangeEndpoint, pathFromElement } from "../utils/domPath.js";
|
|
5
|
+
export function useAAFocus() {
|
|
6
|
+
const { setLocal } = useAAEphemeral("aa:focus");
|
|
7
|
+
const route = useRoute();
|
|
8
|
+
let raf = 0;
|
|
9
|
+
let lastSerialized = null;
|
|
10
|
+
const pointer = { clientX: 0, clientY: 0, fresh: false };
|
|
11
|
+
function publish(payload) {
|
|
12
|
+
if (pointer.fresh) {
|
|
13
|
+
const anchor = serializePointer(pointer.clientX, pointer.clientY);
|
|
14
|
+
if (anchor) payload.pointer = anchor;
|
|
15
|
+
}
|
|
16
|
+
payload.scrollers = collectScrollers();
|
|
17
|
+
const json = JSON.stringify(payload);
|
|
18
|
+
if (json === lastSerialized) return;
|
|
19
|
+
lastSerialized = json;
|
|
20
|
+
setLocal(payload);
|
|
21
|
+
}
|
|
22
|
+
function clear() {
|
|
23
|
+
if (lastSerialized === null) return;
|
|
24
|
+
lastSerialized = null;
|
|
25
|
+
setLocal(null);
|
|
26
|
+
}
|
|
27
|
+
function isAnchorable(el) {
|
|
28
|
+
if (!el) return false;
|
|
29
|
+
if (el.closest?.("[data-aa-skip-anchor]")) return false;
|
|
30
|
+
if (el.id?.startsWith("reka-")) return false;
|
|
31
|
+
if (el.classList?.contains("aa-global-focus-layer")) return false;
|
|
32
|
+
if (el.classList?.contains("aa-presence-blobs")) return false;
|
|
33
|
+
if (el.classList?.contains("aa-follow-bar")) return false;
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
function pickAnchorElement() {
|
|
37
|
+
const viewportH = window.innerHeight || document.documentElement.clientHeight;
|
|
38
|
+
const targetY = viewportH * 0.25;
|
|
39
|
+
const candidates = document.elementsFromPoint(window.innerWidth / 2, targetY);
|
|
40
|
+
for (const el of candidates) {
|
|
41
|
+
if (!isAnchorable(el)) continue;
|
|
42
|
+
const rect = el.getBoundingClientRect();
|
|
43
|
+
return { el, ratio: rect.top / viewportH };
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function collectScrollers() {
|
|
48
|
+
const out = [];
|
|
49
|
+
const winPick = pickElementInside(null);
|
|
50
|
+
if (winPick) out.push(winPick);
|
|
51
|
+
const all = document.querySelectorAll("*");
|
|
52
|
+
const seen = /* @__PURE__ */ new Set();
|
|
53
|
+
for (const el of all) {
|
|
54
|
+
if (seen.has(el)) continue;
|
|
55
|
+
seen.add(el);
|
|
56
|
+
if (!isAnchorable(el)) continue;
|
|
57
|
+
const style = getComputedStyle(el);
|
|
58
|
+
const oy = style.overflowY;
|
|
59
|
+
if (oy !== "auto" && oy !== "scroll" || el.scrollHeight <= el.clientHeight + 4) continue;
|
|
60
|
+
const containerPath = pathFromElement(el);
|
|
61
|
+
if (!containerPath) continue;
|
|
62
|
+
const pick = pickElementInside(el);
|
|
63
|
+
if (pick) out.push({ ...pick, containerPath });
|
|
64
|
+
if (out.length > 6) break;
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
function pickElementInside(container) {
|
|
69
|
+
let probeX, probeY, viewportTop, viewportH;
|
|
70
|
+
if (container) {
|
|
71
|
+
const r = container.getBoundingClientRect();
|
|
72
|
+
probeX = r.left + Math.min(r.width * 0.5, 80);
|
|
73
|
+
probeY = r.top + 6;
|
|
74
|
+
viewportTop = r.top;
|
|
75
|
+
viewportH = r.height;
|
|
76
|
+
} else {
|
|
77
|
+
const vh = window.innerHeight || document.documentElement.clientHeight;
|
|
78
|
+
probeX = window.innerWidth / 2;
|
|
79
|
+
probeY = vh * 0.05;
|
|
80
|
+
viewportTop = 0;
|
|
81
|
+
viewportH = vh;
|
|
82
|
+
}
|
|
83
|
+
const candidates = document.elementsFromPoint(probeX, probeY);
|
|
84
|
+
for (const el of candidates) {
|
|
85
|
+
if (!isAnchorable(el)) continue;
|
|
86
|
+
if (container && !container.contains(el)) continue;
|
|
87
|
+
if (container && el === container) continue;
|
|
88
|
+
const elPath = pathFromElement(el);
|
|
89
|
+
if (!elPath) continue;
|
|
90
|
+
const r = el.getBoundingClientRect();
|
|
91
|
+
const ratio = (r.top - viewportTop) / Math.max(1, viewportH);
|
|
92
|
+
return { elementPath: elPath, ratio };
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
function serializePointer(clientX, clientY) {
|
|
97
|
+
const candidates = document.elementsFromPoint(clientX, clientY);
|
|
98
|
+
for (const el of candidates) {
|
|
99
|
+
if (!isAnchorable(el)) continue;
|
|
100
|
+
const path = pathFromElement(el);
|
|
101
|
+
if (!path) continue;
|
|
102
|
+
const r = el.getBoundingClientRect();
|
|
103
|
+
return { elementPath: path, dx: clientX - r.left, dy: clientY - r.top };
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
function snapshot() {
|
|
108
|
+
cancelAnimationFrame(raf);
|
|
109
|
+
raf = requestAnimationFrame(() => {
|
|
110
|
+
const sel = window.getSelection();
|
|
111
|
+
if (sel && sel.rangeCount > 0 && !sel.isCollapsed) {
|
|
112
|
+
const range = sel.getRangeAt(0);
|
|
113
|
+
const anchor = range.startContainer instanceof Element ? range.startContainer : range.startContainer.parentElement;
|
|
114
|
+
if (anchor?.closest?.("input, textarea")) return;
|
|
115
|
+
if (anchor?.closest?.(".aa-caret-layer")) return;
|
|
116
|
+
if (anchor?.closest?.(".aa-global-focus-layer")) return;
|
|
117
|
+
const start = serializeRangeEndpoint(range.startContainer, range.startOffset);
|
|
118
|
+
const end = serializeRangeEndpoint(range.endContainer, range.endOffset);
|
|
119
|
+
if (start && end) {
|
|
120
|
+
publish({ kind: "selection", route: route.path, start, end });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const picked = pickAnchorElement();
|
|
125
|
+
if (!picked) {
|
|
126
|
+
clear();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const path = pathFromElement(picked.el);
|
|
130
|
+
if (!path) {
|
|
131
|
+
clear();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
publish({ kind: "anchor", route: route.path, anchor: { elementPath: path }, anchorRatio: picked.ratio });
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function onSelectionChange() {
|
|
138
|
+
snapshot();
|
|
139
|
+
}
|
|
140
|
+
function onScroll() {
|
|
141
|
+
snapshot();
|
|
142
|
+
}
|
|
143
|
+
function onResize() {
|
|
144
|
+
snapshot();
|
|
145
|
+
}
|
|
146
|
+
function onPointerMove(e) {
|
|
147
|
+
pointer.clientX = e.clientX;
|
|
148
|
+
pointer.clientY = e.clientY;
|
|
149
|
+
pointer.fresh = true;
|
|
150
|
+
snapshot();
|
|
151
|
+
}
|
|
152
|
+
function onPointerLeave() {
|
|
153
|
+
pointer.fresh = false;
|
|
154
|
+
snapshot();
|
|
155
|
+
}
|
|
156
|
+
onMounted(() => {
|
|
157
|
+
document.addEventListener("selectionchange", onSelectionChange);
|
|
158
|
+
document.addEventListener("scroll", onScroll, { passive: true, capture: true });
|
|
159
|
+
document.addEventListener("pointermove", onPointerMove, { passive: true });
|
|
160
|
+
document.addEventListener("pointerleave", onPointerLeave);
|
|
161
|
+
window.addEventListener("resize", onResize, { passive: true });
|
|
162
|
+
snapshot();
|
|
163
|
+
});
|
|
164
|
+
onScopeDispose(() => {
|
|
165
|
+
cancelAnimationFrame(raf);
|
|
166
|
+
document.removeEventListener("selectionchange", onSelectionChange);
|
|
167
|
+
document.removeEventListener("scroll", onScroll, { capture: true });
|
|
168
|
+
document.removeEventListener("pointermove", onPointerMove);
|
|
169
|
+
document.removeEventListener("pointerleave", onPointerLeave);
|
|
170
|
+
window.removeEventListener("resize", onResize);
|
|
171
|
+
clear();
|
|
172
|
+
});
|
|
173
|
+
return { snapshot };
|
|
174
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Ref } from 'vue';
|
|
2
|
+
import type { AAFocusPayload } from './useAAFocus.js';
|
|
3
|
+
/**
|
|
4
|
+
* Smart anchor-based scroll-follow.
|
|
5
|
+
*
|
|
6
|
+
* Given a leader's `clientId` (or `publicKey`), this composable:
|
|
7
|
+
* 1. Watches the leader's `peer:aa:focus` payload
|
|
8
|
+
* 2. If the leader is on a different route, navigates the local browser
|
|
9
|
+
* to match (via vue-router push)
|
|
10
|
+
* 3. Once on the same route, finds the leader's anchor element in the
|
|
11
|
+
* LOCAL DOM and scrolls it to the same vertical position the leader
|
|
12
|
+
* had it at — i.e. preserves the leader's `anchorRatio` rather than
|
|
13
|
+
* copying raw scroll px. This keeps the experience consistent across
|
|
14
|
+
* different viewport heights and zoom levels.
|
|
15
|
+
*
|
|
16
|
+
* Selection-kind payloads use the selection's start element as the anchor
|
|
17
|
+
* (the user is presumably reading where they're highlighting).
|
|
18
|
+
*
|
|
19
|
+
* Pass `null` (or `undefined`) for `leaderId` to disable the follow.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useAAFollowAnchor(leaderId: Ref<number | null | undefined>): {
|
|
22
|
+
leader: import("vue").ComputedRef<import("../types.js").AwarenessPeer | null>;
|
|
23
|
+
leaderPayload: import("vue").ComputedRef<AAFocusPayload | null>;
|
|
24
|
+
scrollToLeader: () => void;
|
|
25
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { computed, watch } from "vue";
|
|
2
|
+
import { useRoute, useRouter } from "#imports";
|
|
3
|
+
import { useAAEphemeral } from "./useAAEphemeral.js";
|
|
4
|
+
import { useAwarenessPeers } from "./useAwarenessPeers.js";
|
|
5
|
+
import { elementFromPath } from "../utils/domPath.js";
|
|
6
|
+
export function useAAFollowAnchor(leaderId) {
|
|
7
|
+
const { peers } = useAAEphemeral("aa:focus");
|
|
8
|
+
const { peers: allPeers } = useAwarenessPeers();
|
|
9
|
+
const route = useRoute();
|
|
10
|
+
const router = useRouter();
|
|
11
|
+
let scrollRaf = 0;
|
|
12
|
+
let lastTargetKey = "";
|
|
13
|
+
const leaderPayload = computed(() => {
|
|
14
|
+
const id = leaderId.value;
|
|
15
|
+
if (id == null) return null;
|
|
16
|
+
const found = peers.value.find((p) => p.clientId === id);
|
|
17
|
+
return found?.value ?? null;
|
|
18
|
+
});
|
|
19
|
+
watch(leaderPayload, (payload) => {
|
|
20
|
+
if (!payload) return;
|
|
21
|
+
if (payload.route && payload.route !== route.path) {
|
|
22
|
+
router.push(payload.route).catch(() => {
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}, { immediate: true });
|
|
26
|
+
function scrollToLeader() {
|
|
27
|
+
cancelAnimationFrame(scrollRaf);
|
|
28
|
+
scrollRaf = requestAnimationFrame(() => {
|
|
29
|
+
const payload = leaderPayload.value;
|
|
30
|
+
if (!payload) return;
|
|
31
|
+
if (payload.route !== route.path) return;
|
|
32
|
+
const instructions = [];
|
|
33
|
+
if (payload.scrollers && payload.scrollers.length) {
|
|
34
|
+
for (const s of payload.scrollers) {
|
|
35
|
+
instructions.push({ container: s.containerPath, element: s.elementPath, ratio: s.ratio });
|
|
36
|
+
}
|
|
37
|
+
} else if (payload.kind === "anchor" && payload.anchor) {
|
|
38
|
+
instructions.push({ element: payload.anchor.elementPath, ratio: payload.anchorRatio ?? 0.05 });
|
|
39
|
+
} else if (payload.kind === "selection" && payload.start) {
|
|
40
|
+
instructions.push({ element: payload.start.elementPath, ratio: 0.2 });
|
|
41
|
+
}
|
|
42
|
+
const fingerprint = [];
|
|
43
|
+
for (const ins of instructions) {
|
|
44
|
+
const target = elementFromPath(ins.element);
|
|
45
|
+
if (!target || !target.isConnected) continue;
|
|
46
|
+
const scroller = ins.container ? elementFromPath(ins.container) ?? window : window;
|
|
47
|
+
const isWindow = scroller === window;
|
|
48
|
+
const scrollerRect = isWindow ? { top: 0, height: window.innerHeight || document.documentElement.clientHeight } : scroller.getBoundingClientRect();
|
|
49
|
+
const desiredTop = scrollerRect.top + scrollerRect.height * Math.max(0, Math.min(0.9, ins.ratio));
|
|
50
|
+
const rect = target.getBoundingClientRect();
|
|
51
|
+
const delta = rect.top - desiredTop;
|
|
52
|
+
fingerprint.push(`${isWindow ? "w" : ins.container?.join(",")}-${Math.round(rect.top)}-${ins.ratio.toFixed(3)}`);
|
|
53
|
+
if (Math.abs(delta) < 8) continue;
|
|
54
|
+
if (isWindow) window.scrollBy({ top: delta, behavior: "smooth" });
|
|
55
|
+
else scroller.scrollBy({ top: delta, behavior: "smooth" });
|
|
56
|
+
}
|
|
57
|
+
const key = fingerprint.join("|");
|
|
58
|
+
if (key === lastTargetKey) return;
|
|
59
|
+
lastTargetKey = key;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
watch(leaderPayload, scrollToLeader, { deep: true, flush: "post" });
|
|
63
|
+
const leader = computed(() => {
|
|
64
|
+
const id = leaderId.value;
|
|
65
|
+
if (id == null) return null;
|
|
66
|
+
return allPeers.value.find((p) => p.clientId === id) ?? null;
|
|
67
|
+
});
|
|
68
|
+
return { leader, leaderPayload, scrollToLeader };
|
|
69
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Follow another peer's `aware-ui` keys live. Reads the target peer's most
|
|
3
|
+
* recent writes to the shared `aware-ui` Y.Map and re-applies them locally
|
|
4
|
+
* by writing the same `{value, by, ts}` shape under our own clientId, so any
|
|
5
|
+
* `live`-bound aware component snaps to the leader's UI state (active tab,
|
|
6
|
+
* expanded accordion, current page, modal open, etc.).
|
|
7
|
+
*
|
|
8
|
+
* Activation is explicit — call `follow(clientId)` from `<AFollowBar>`. Local
|
|
9
|
+
* interaction (any keystroke, click, or scroll) calls `unfollow()` so the
|
|
10
|
+
* follower can break out at any time.
|
|
11
|
+
*
|
|
12
|
+
* Optional `keyPrefix` scopes the follow to a subset of UI keys; default
|
|
13
|
+
* follows everything the leader writes.
|
|
14
|
+
*/
|
|
15
|
+
export interface UseAAFollowPeerOptions {
|
|
16
|
+
/** Only mirror keys that start with this prefix. */
|
|
17
|
+
keyPrefix?: string;
|
|
18
|
+
/** Hook fired when the user breaks follow via local interaction. */
|
|
19
|
+
onBreak?: () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function useAAFollowPeer(options?: UseAAFollowPeerOptions): {
|
|
22
|
+
follow: (clientId: number) => void;
|
|
23
|
+
unfollow: () => void;
|
|
24
|
+
followingClientId: import("vue").Ref<number | null, number | null>;
|
|
25
|
+
followingUser: import("vue").ComputedRef<{
|
|
26
|
+
name?: string;
|
|
27
|
+
color?: string;
|
|
28
|
+
} | null>;
|
|
29
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { computed, onScopeDispose, ref, watch } from "vue";
|
|
2
|
+
import { useAbracadabra } from "./useAbracadabra.js";
|
|
3
|
+
import { useSyncedMap } from "./useYDoc.js";
|
|
4
|
+
import { useAwareness } from "./useAwareness.js";
|
|
5
|
+
const _followingClientId = ref(null);
|
|
6
|
+
export function useAAFollowPeer(options = {}) {
|
|
7
|
+
const { doc, provider } = useAbracadabra();
|
|
8
|
+
const { data, set } = useSyncedMap(doc, "aware-ui");
|
|
9
|
+
const { states } = useAwareness();
|
|
10
|
+
const followingClientId = _followingClientId;
|
|
11
|
+
let unsubInteraction = null;
|
|
12
|
+
const followingUser = computed(() => {
|
|
13
|
+
if (followingClientId.value == null) return null;
|
|
14
|
+
const state = states.value.get(followingClientId.value);
|
|
15
|
+
return state?.user ?? null;
|
|
16
|
+
});
|
|
17
|
+
function detachInteraction() {
|
|
18
|
+
unsubInteraction?.();
|
|
19
|
+
unsubInteraction = null;
|
|
20
|
+
}
|
|
21
|
+
function attachInteractionBreaker() {
|
|
22
|
+
detachInteraction();
|
|
23
|
+
if (typeof window === "undefined") return;
|
|
24
|
+
const onBreak = () => unfollow();
|
|
25
|
+
window.addEventListener("keydown", onBreak);
|
|
26
|
+
window.addEventListener("pointerdown", onBreak);
|
|
27
|
+
window.addEventListener("wheel", onBreak, { passive: true });
|
|
28
|
+
unsubInteraction = () => {
|
|
29
|
+
window.removeEventListener("keydown", onBreak);
|
|
30
|
+
window.removeEventListener("pointerdown", onBreak);
|
|
31
|
+
window.removeEventListener("wheel", onBreak);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function follow(clientId) {
|
|
35
|
+
if (followingClientId.value === clientId) return;
|
|
36
|
+
followingClientId.value = clientId;
|
|
37
|
+
attachInteractionBreaker();
|
|
38
|
+
}
|
|
39
|
+
function unfollow() {
|
|
40
|
+
if (followingClientId.value == null) return;
|
|
41
|
+
followingClientId.value = null;
|
|
42
|
+
detachInteraction();
|
|
43
|
+
options.onBreak?.();
|
|
44
|
+
}
|
|
45
|
+
const myClientId = computed(() => provider.value?.awareness?.clientID);
|
|
46
|
+
watch(
|
|
47
|
+
() => Object.entries(data),
|
|
48
|
+
(entries) => {
|
|
49
|
+
const target = followingClientId.value;
|
|
50
|
+
if (target == null) return;
|
|
51
|
+
const me = myClientId.value;
|
|
52
|
+
const prefix = options.keyPrefix;
|
|
53
|
+
for (const [key, entry] of entries) {
|
|
54
|
+
if (!entry || typeof entry !== "object") continue;
|
|
55
|
+
if (entry.by !== target) continue;
|
|
56
|
+
if (prefix && !key.startsWith(prefix)) continue;
|
|
57
|
+
set(key, { value: entry.value, by: me, ts: Date.now() });
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{ deep: true }
|
|
61
|
+
);
|
|
62
|
+
watch(followingClientId, (target) => {
|
|
63
|
+
if (target == null) return;
|
|
64
|
+
const me = myClientId.value;
|
|
65
|
+
const prefix = options.keyPrefix;
|
|
66
|
+
for (const [key, entry] of Object.entries(data)) {
|
|
67
|
+
if (!entry || typeof entry !== "object") continue;
|
|
68
|
+
if (entry.by !== target) continue;
|
|
69
|
+
if (prefix && !key.startsWith(prefix)) continue;
|
|
70
|
+
set(key, { value: entry.value, by: me, ts: Date.now() });
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
onScopeDispose(detachInteraction);
|
|
74
|
+
return { follow, unfollow, followingClientId, followingUser };
|
|
75
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broadcast the local user's most recent shortcut press as a short-lived
|
|
3
|
+
* ephemeral field. Receivers (`<AKeyHint>`, presence overlays) flash a brief
|
|
4
|
+
* "Janis just pressed ⌘K" indicator on the avatar.
|
|
5
|
+
*
|
|
6
|
+
* Each `pressKey(label)` call publishes `{ label, ts }` for ~1s, then auto-
|
|
7
|
+
* clears so peers don't see stale shortcuts.
|
|
8
|
+
*/
|
|
9
|
+
export interface PeerKeyHint {
|
|
10
|
+
clientId: number;
|
|
11
|
+
label: string;
|
|
12
|
+
ts: number;
|
|
13
|
+
user?: {
|
|
14
|
+
name?: string;
|
|
15
|
+
color?: string;
|
|
16
|
+
publicKey?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function useAAKey(): {
|
|
20
|
+
pressKey: (label: string) => void;
|
|
21
|
+
hints: import("vue").ComputedRef<PeerKeyHint[]>;
|
|
22
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { computed, onScopeDispose } from "vue";
|
|
2
|
+
import { useAAEphemeral } from "./useAAEphemeral.js";
|
|
3
|
+
const HOLD_MS = 1e3;
|
|
4
|
+
export function useAAKey() {
|
|
5
|
+
const { peers, setLocal } = useAAEphemeral(() => "key:last");
|
|
6
|
+
let timer = null;
|
|
7
|
+
function pressKey(label) {
|
|
8
|
+
if (timer) clearTimeout(timer);
|
|
9
|
+
setLocal({ label, ts: Date.now() });
|
|
10
|
+
timer = setTimeout(() => {
|
|
11
|
+
setLocal(null);
|
|
12
|
+
timer = null;
|
|
13
|
+
}, HOLD_MS);
|
|
14
|
+
}
|
|
15
|
+
onScopeDispose(() => {
|
|
16
|
+
if (timer) clearTimeout(timer);
|
|
17
|
+
setLocal(null);
|
|
18
|
+
});
|
|
19
|
+
const hints = computed(() => {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
return peers.value.filter((p) => p.value && now - p.value.ts < HOLD_MS).map((p) => ({ clientId: p.clientId, label: p.value.label, ts: p.value.ts, user: p.user }));
|
|
22
|
+
});
|
|
23
|
+
return { pressKey, hints };
|
|
24
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Ref } from 'vue';
|
|
2
|
+
import type { MaybeRefOrGetter } from 'vue';
|
|
3
|
+
/**
|
|
4
|
+
* Per-peer free-floating mouse pointer position over a scoped element.
|
|
5
|
+
*
|
|
6
|
+
* The local pointer position (relative to the scoped element's bounding box)
|
|
7
|
+
* is broadcast as `peer:pointer:<scope>` ephemeral state, RAF-throttled to
|
|
8
|
+
* the display refresh rate. Reads return every other peer's `{ x, y, vis }`
|
|
9
|
+
* with their user info attached, ready for rendering by `<APresenceCursors>`.
|
|
10
|
+
*
|
|
11
|
+
* Coordinates are normalised in [0, 1] so receivers can render at their own
|
|
12
|
+
* element size without sender-side knowledge of viewport dimensions.
|
|
13
|
+
*/
|
|
14
|
+
export interface PeerPointer {
|
|
15
|
+
clientId: number;
|
|
16
|
+
/** Normalised x within the scope element (0..1). */
|
|
17
|
+
x: number;
|
|
18
|
+
/** Normalised y within the scope element (0..1). */
|
|
19
|
+
y: number;
|
|
20
|
+
/** Whether the peer's pointer is inside the scope right now. */
|
|
21
|
+
vis: boolean;
|
|
22
|
+
user?: {
|
|
23
|
+
name?: string;
|
|
24
|
+
color?: string;
|
|
25
|
+
publicKey?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function useAAPointer(scope: MaybeRefOrGetter<string>, elementRef: Ref<HTMLElement | null | undefined>): {
|
|
29
|
+
pointers: import("vue").ComputedRef<PeerPointer[]>;
|
|
30
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { computed, onScopeDispose, watch } from "vue";
|
|
2
|
+
import { useAAEphemeral } from "./useAAEphemeral.js";
|
|
3
|
+
export function useAAPointer(scope, elementRef) {
|
|
4
|
+
const slot = computed(() => `pointer:${typeof scope === "function" ? scope() : scope?.value ?? scope}`);
|
|
5
|
+
const { peers, setLocal } = useAAEphemeral(slot);
|
|
6
|
+
let raf = 0;
|
|
7
|
+
let pending = null;
|
|
8
|
+
function flush() {
|
|
9
|
+
raf = 0;
|
|
10
|
+
if (pending) setLocal(pending);
|
|
11
|
+
}
|
|
12
|
+
function onMove(e) {
|
|
13
|
+
const el = elementRef.value;
|
|
14
|
+
if (!el) return;
|
|
15
|
+
const rect = el.getBoundingClientRect();
|
|
16
|
+
if (rect.width === 0 || rect.height === 0) return;
|
|
17
|
+
const x = (e.clientX - rect.left) / rect.width;
|
|
18
|
+
const y = (e.clientY - rect.top) / rect.height;
|
|
19
|
+
pending = { x, y, vis: x >= 0 && x <= 1 && y >= 0 && y <= 1 };
|
|
20
|
+
if (!raf) raf = requestAnimationFrame(flush);
|
|
21
|
+
}
|
|
22
|
+
function onLeave() {
|
|
23
|
+
pending = { x: 0, y: 0, vis: false };
|
|
24
|
+
if (!raf) raf = requestAnimationFrame(flush);
|
|
25
|
+
}
|
|
26
|
+
let attached = null;
|
|
27
|
+
function attach(el) {
|
|
28
|
+
if (attached === el) return;
|
|
29
|
+
detach();
|
|
30
|
+
attached = el;
|
|
31
|
+
el.addEventListener("pointermove", onMove);
|
|
32
|
+
el.addEventListener("pointerleave", onLeave);
|
|
33
|
+
}
|
|
34
|
+
function detach() {
|
|
35
|
+
if (!attached) return;
|
|
36
|
+
attached.removeEventListener("pointermove", onMove);
|
|
37
|
+
attached.removeEventListener("pointerleave", onLeave);
|
|
38
|
+
attached = null;
|
|
39
|
+
setLocal(null);
|
|
40
|
+
}
|
|
41
|
+
watch(elementRef, (el) => {
|
|
42
|
+
if (el) attach(el);
|
|
43
|
+
else detach();
|
|
44
|
+
}, { immediate: true, flush: "post" });
|
|
45
|
+
onScopeDispose(() => {
|
|
46
|
+
if (raf) cancelAnimationFrame(raf);
|
|
47
|
+
detach();
|
|
48
|
+
});
|
|
49
|
+
const pointers = computed(
|
|
50
|
+
() => peers.value.filter((p) => p.value.vis).map((p) => ({ clientId: p.clientId, x: p.value.x, y: p.value.y, vis: p.value.vis, user: p.user }))
|
|
51
|
+
);
|
|
52
|
+
return { pointers };
|
|
53
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type WritableComputedRef } from 'vue';
|
|
2
|
+
import type { MaybeRefOrGetter } from 'vue';
|
|
3
|
+
/**
|
|
4
|
+
* Shared UI state across every connected tab — the building block under the
|
|
5
|
+
* `live` prop on every aware component.
|
|
6
|
+
*
|
|
7
|
+
* Stores a single value keyed by `fieldKey` on a shared Y.Map called
|
|
8
|
+
* `aware-ui` on the root Y.Doc. All connected peers read and write the same
|
|
9
|
+
* record, so opening a dropdown / expanding an accordion / switching a tab
|
|
10
|
+
* happens *live* on every screen.
|
|
11
|
+
*
|
|
12
|
+
* Distinct from `useAAFieldValue`:
|
|
13
|
+
* - `useAAFieldValue` stores the *bound primitive value* (input text, switch on/off)
|
|
14
|
+
* - `useAAUIState` stores *UI chrome state* (open, expanded, sort col, current page)
|
|
15
|
+
* - Different Y.Map names so reset / introspection / TTL logic stay separate.
|
|
16
|
+
*
|
|
17
|
+
* Each entry carries `{ value, by, ts }` so receivers can attribute the
|
|
18
|
+
* change ("opened by Janis") and apply last-write-wins on conflict.
|
|
19
|
+
*/
|
|
20
|
+
export interface UseAAUIStateOptions<T> {
|
|
21
|
+
/** Returned when no entry exists yet. */
|
|
22
|
+
defaultValue?: T;
|
|
23
|
+
}
|
|
24
|
+
export declare function useAAUIState<T = unknown>(fieldKey: MaybeRefOrGetter<string>, options?: UseAAUIStateOptions<T>): WritableComputedRef<T | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* Read who last wrote a given live UI field — used to render attribution
|
|
27
|
+
* labels ("opened by Janis") in `live` components.
|
|
28
|
+
*/
|
|
29
|
+
export declare function useAAUIStateAuthor(fieldKey: MaybeRefOrGetter<string>): import("vue").ComputedRef<number | undefined>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { computed } from "vue";
|
|
2
|
+
import { useAbracadabra } from "./useAbracadabra.js";
|
|
3
|
+
import { useSyncedMap } from "./useYDoc.js";
|
|
4
|
+
function resolveKey(fieldKey) {
|
|
5
|
+
if (typeof fieldKey === "function") return fieldKey();
|
|
6
|
+
if (fieldKey && typeof fieldKey === "object" && "value" in fieldKey) return fieldKey.value;
|
|
7
|
+
return fieldKey;
|
|
8
|
+
}
|
|
9
|
+
export function useAAUIState(fieldKey, options = {}) {
|
|
10
|
+
const { doc, provider } = useAbracadabra();
|
|
11
|
+
const { data, set } = useSyncedMap(doc, "aware-ui");
|
|
12
|
+
return computed({
|
|
13
|
+
get() {
|
|
14
|
+
const entry = data[resolveKey(fieldKey)];
|
|
15
|
+
if (!entry) return options.defaultValue;
|
|
16
|
+
return entry.value;
|
|
17
|
+
},
|
|
18
|
+
set(value) {
|
|
19
|
+
const by = provider.value?.awareness?.clientID;
|
|
20
|
+
set(resolveKey(fieldKey), { value, by, ts: Date.now() });
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function useAAUIStateAuthor(fieldKey) {
|
|
25
|
+
const { doc } = useAbracadabra();
|
|
26
|
+
const { data } = useSyncedMap(doc, "aware-ui");
|
|
27
|
+
return computed(() => data[resolveKey(fieldKey)]?.by);
|
|
28
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Ref } from 'vue';
|
|
2
|
+
import type { MaybeRefOrGetter } from 'vue';
|
|
3
|
+
/**
|
|
4
|
+
* IntersectionObserver-based "what section is this peer currently looking at"
|
|
5
|
+
* — broadcasts the data-section attribute of the most-visible region under a
|
|
6
|
+
* scoped container as `peer:viewport:<scope>` ephemeral state.
|
|
7
|
+
*
|
|
8
|
+
* Use case: render "Janis is reading the API section" overlays in long docs.
|
|
9
|
+
* Pair with `<APresenceCursors>` for a complete spatial-presence layer.
|
|
10
|
+
*/
|
|
11
|
+
export interface PeerViewport {
|
|
12
|
+
clientId: number;
|
|
13
|
+
section: string;
|
|
14
|
+
user?: {
|
|
15
|
+
name?: string;
|
|
16
|
+
color?: string;
|
|
17
|
+
publicKey?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function useAAViewport(scope: MaybeRefOrGetter<string>, elementRef: Ref<HTMLElement | null | undefined>): {
|
|
21
|
+
viewports: import("vue").ComputedRef<PeerViewport[]>;
|
|
22
|
+
};
|