@50arms/ui 0.0.0-stage → 35.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.
- package/LICENSE +21 -0
- package/README.md +193 -2
- package/dist/components/Accordion.js +68 -0
- package/dist/components/Accordion.js.map +1 -0
- package/dist/components/AgentWorkingSpinner.js +46 -0
- package/dist/components/AgentWorkingSpinner.js.map +1 -0
- package/dist/components/AppShell.js +228 -0
- package/dist/components/AppShell.js.map +1 -0
- package/dist/components/Attention.js +130 -0
- package/dist/components/Attention.js.map +1 -0
- package/dist/components/Avatar.js +99 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.js +143 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Board.js +292 -0
- package/dist/components/Board.js.map +1 -0
- package/dist/components/Button.js +327 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Callout.js +106 -0
- package/dist/components/Callout.js.map +1 -0
- package/dist/components/Card.js +140 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/Choice.js +361 -0
- package/dist/components/Choice.js.map +1 -0
- package/dist/components/CodeEditor.js +384 -0
- package/dist/components/CodeEditor.js.map +1 -0
- package/dist/components/ColorPicker.js +174 -0
- package/dist/components/ColorPicker.js.map +1 -0
- package/dist/components/Combobox.js +212 -0
- package/dist/components/Combobox.js.map +1 -0
- package/dist/components/CommandPalette.js +163 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/ConcentricRing.js +60 -0
- package/dist/components/ConcentricRing.js.map +1 -0
- package/dist/components/ConnectionCard.js +98 -0
- package/dist/components/ConnectionCard.js.map +1 -0
- package/dist/components/ContextItemRow.js +49 -0
- package/dist/components/ContextItemRow.js.map +1 -0
- package/dist/components/CopyValue.js +57 -0
- package/dist/components/CopyValue.js.map +1 -0
- package/dist/components/CountBadge.js +26 -0
- package/dist/components/CountBadge.js.map +1 -0
- package/dist/components/DateCalendar.js +156 -0
- package/dist/components/DateCalendar.js.map +1 -0
- package/dist/components/DateField.js +166 -0
- package/dist/components/DateField.js.map +1 -0
- package/dist/components/DatePicker.js +56 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DateTimeText.js +19 -0
- package/dist/components/DateTimeText.js.map +1 -0
- package/dist/components/DescriptionList.js +25 -0
- package/dist/components/DescriptionList.js.map +1 -0
- package/dist/components/Dialog.js +332 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/components/DragDrop.js +395 -0
- package/dist/components/DragDrop.js.map +1 -0
- package/dist/components/Drawer.js +100 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/EditGutter.js +110 -0
- package/dist/components/EditGutter.js.map +1 -0
- package/dist/components/EmojiPicker.js +174 -0
- package/dist/components/EmojiPicker.js.map +1 -0
- package/dist/components/ErrorBoundary.js +47 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/Field.js +115 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/FileUpload.js +128 -0
- package/dist/components/FileUpload.js.map +1 -0
- package/dist/components/FilterMenu.js +256 -0
- package/dist/components/FilterMenu.js.map +1 -0
- package/dist/components/GatesSection.js +79 -0
- package/dist/components/GatesSection.js.map +1 -0
- package/dist/components/Icon.js +50 -0
- package/dist/components/Icon.js.map +1 -0
- package/dist/components/IconButton.js +59 -0
- package/dist/components/IconButton.js.map +1 -0
- package/dist/components/IconStack.js +69 -0
- package/dist/components/IconStack.js.map +1 -0
- package/dist/components/ImageUploadField.js +146 -0
- package/dist/components/ImageUploadField.js.map +1 -0
- package/dist/components/InlineEdit.js +432 -0
- package/dist/components/InlineEdit.js.map +1 -0
- package/dist/components/InlineMarkdownEdit.js +184 -0
- package/dist/components/InlineMarkdownEdit.js.map +1 -0
- package/dist/components/Input.js +156 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/LegalDocument.js +155 -0
- package/dist/components/LegalDocument.js.map +1 -0
- package/dist/components/LineDiff.js +95 -0
- package/dist/components/LineDiff.js.map +1 -0
- package/dist/components/ListHeader.js +72 -0
- package/dist/components/ListHeader.js.map +1 -0
- package/dist/components/Loading.js +111 -0
- package/dist/components/Loading.js.map +1 -0
- package/dist/components/Markdown.js +28 -0
- package/dist/components/Markdown.js.map +1 -0
- package/dist/components/MarkdownEditor.js +467 -0
- package/dist/components/MarkdownEditor.js.map +1 -0
- package/dist/components/Menu.js +185 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/Navigation.js +87 -0
- package/dist/components/Navigation.js.map +1 -0
- package/dist/components/NumberInput.js +119 -0
- package/dist/components/NumberInput.js.map +1 -0
- package/dist/components/OTPInput.js +71 -0
- package/dist/components/OTPInput.js.map +1 -0
- package/dist/components/OrderedEntityManager.js +170 -0
- package/dist/components/OrderedEntityManager.js.map +1 -0
- package/dist/components/PagedWindowList.js +74 -0
- package/dist/components/PagedWindowList.js.map +1 -0
- package/dist/components/PaginationBar.js +95 -0
- package/dist/components/PaginationBar.js.map +1 -0
- package/dist/components/Panel.js +396 -0
- package/dist/components/Panel.js.map +1 -0
- package/dist/components/PasswordInput.js +32 -0
- package/dist/components/PasswordInput.js.map +1 -0
- package/dist/components/PasswordRequirements.js +25 -0
- package/dist/components/PasswordRequirements.js.map +1 -0
- package/dist/components/PatchDiff.js +96 -0
- package/dist/components/PatchDiff.js.map +1 -0
- package/dist/components/PendingVeil.js +18 -0
- package/dist/components/PendingVeil.js.map +1 -0
- package/dist/components/Popover.js +214 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/Progress.js +419 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/RatingScale.js +89 -0
- package/dist/components/RatingScale.js.map +1 -0
- package/dist/components/ReadMore.js +232 -0
- package/dist/components/ReadMore.js.map +1 -0
- package/dist/components/RecordCard.js +202 -0
- package/dist/components/RecordCard.js.map +1 -0
- package/dist/components/RelativeTime.js +29 -0
- package/dist/components/RelativeTime.js.map +1 -0
- package/dist/components/SandboxedFrame.js +135 -0
- package/dist/components/SandboxedFrame.js.map +1 -0
- package/dist/components/SearchInput.js +38 -0
- package/dist/components/SearchInput.js.map +1 -0
- package/dist/components/SecretField.js +228 -0
- package/dist/components/SecretField.js.map +1 -0
- package/dist/components/SectionNav.js +42 -0
- package/dist/components/SectionNav.js.map +1 -0
- package/dist/components/Select.js +172 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SequenceDiagram.js +109 -0
- package/dist/components/SequenceDiagram.js.map +1 -0
- package/dist/components/SettingRow.js +124 -0
- package/dist/components/SettingRow.js.map +1 -0
- package/dist/components/SignOffRings.js +36 -0
- package/dist/components/SignOffRings.js.map +1 -0
- package/dist/components/Slider.js +353 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/SolutionChoice.js +89 -0
- package/dist/components/SolutionChoice.js.map +1 -0
- package/dist/components/SortMenu.js +75 -0
- package/dist/components/SortMenu.js.map +1 -0
- package/dist/components/Spinner.js +42 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/Stat.js +148 -0
- package/dist/components/Stat.js.map +1 -0
- package/dist/components/StatusSelect.js +119 -0
- package/dist/components/StatusSelect.js.map +1 -0
- package/dist/components/Surface.js +210 -0
- package/dist/components/Surface.js.map +1 -0
- package/dist/components/Table.js +300 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.js +288 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/ThemeMenu.js +198 -0
- package/dist/components/ThemeMenu.js.map +1 -0
- package/dist/components/Toast.js +217 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Toggle.js +147 -0
- package/dist/components/Toggle.js.map +1 -0
- package/dist/components/ToggleMatrix.js +157 -0
- package/dist/components/ToggleMatrix.js.map +1 -0
- package/dist/components/Tree.js +125 -0
- package/dist/components/Tree.js.map +1 -0
- package/dist/components/TriStateSwitch.js +111 -0
- package/dist/components/TriStateSwitch.js.map +1 -0
- package/dist/components/VideoPlayer.js +64 -0
- package/dist/components/VideoPlayer.js.map +1 -0
- package/dist/components/auth/AcceptInvitationCard.js +110 -0
- package/dist/components/auth/AcceptInvitationCard.js.map +1 -0
- package/dist/components/auth/AuthLayout.js +18 -0
- package/dist/components/auth/AuthLayout.js.map +1 -0
- package/dist/components/auth/ForgotPasswordForm.js +44 -0
- package/dist/components/auth/ForgotPasswordForm.js.map +1 -0
- package/dist/components/auth/LoginForm.js +76 -0
- package/dist/components/auth/LoginForm.js.map +1 -0
- package/dist/components/auth/ResetPasswordForm.js +69 -0
- package/dist/components/auth/ResetPasswordForm.js.map +1 -0
- package/dist/components/auth/SignInProviders.js +45 -0
- package/dist/components/auth/SignInProviders.js.map +1 -0
- package/dist/components/auth/SignupCard.js +204 -0
- package/dist/components/auth/SignupCard.js.map +1 -0
- package/dist/components/auth/TermsAcceptance.js +43 -0
- package/dist/components/auth/TermsAcceptance.js.map +1 -0
- package/dist/components/board/context.js +32 -0
- package/dist/components/board/context.js.map +1 -0
- package/dist/components/board/recipe.js +94 -0
- package/dist/components/board/recipe.js.map +1 -0
- package/dist/components/calendar/CalendarMonth.js +299 -0
- package/dist/components/calendar/CalendarMonth.js.map +1 -0
- package/dist/components/calendar/CalendarTimeGrid.js +430 -0
- package/dist/components/calendar/CalendarTimeGrid.js.map +1 -0
- package/dist/components/calendar/EventActions.js +101 -0
- package/dist/components/calendar/EventActions.js.map +1 -0
- package/dist/components/calendar/format.js +73 -0
- package/dist/components/calendar/format.js.map +1 -0
- package/dist/components/calendar/palette.js +31 -0
- package/dist/components/calendar/palette.js.map +1 -0
- package/dist/components/calendar/use-calendar-drag.js +149 -0
- package/dist/components/calendar/use-calendar-drag.js.map +1 -0
- package/dist/components/calendar/use-event-keyboard.js +87 -0
- package/dist/components/calendar/use-event-keyboard.js.map +1 -0
- package/dist/components/calendar/use-grid-navigation.js +79 -0
- package/dist/components/calendar/use-grid-navigation.js.map +1 -0
- package/dist/components/calendar/use-now.js +27 -0
- package/dist/components/calendar/use-now.js.map +1 -0
- package/dist/components/card-face/AcRingGlyph.js +39 -0
- package/dist/components/card-face/AcRingGlyph.js.map +1 -0
- package/dist/components/card-face/BoardCardAgentSlot.js +17 -0
- package/dist/components/card-face/BoardCardAgentSlot.js.map +1 -0
- package/dist/components/card-face/CardFace.js +109 -0
- package/dist/components/card-face/CardFace.js.map +1 -0
- package/dist/components/card-face/CardTypeBadge.js +17 -0
- package/dist/components/card-face/CardTypeBadge.js.map +1 -0
- package/dist/components/card-face/EffortBadge.js +11 -0
- package/dist/components/card-face/EffortBadge.js.map +1 -0
- package/dist/components/card-face/GateRingGlyph.js +31 -0
- package/dist/components/card-face/GateRingGlyph.js.map +1 -0
- package/dist/components/card-face/OverflowRow.js +70 -0
- package/dist/components/card-face/OverflowRow.js.map +1 -0
- package/dist/components/card-face/TapTip.js +32 -0
- package/dist/components/card-face/TapTip.js.map +1 -0
- package/dist/components/card-face/hit-area.js +6 -0
- package/dist/components/card-face/hit-area.js.map +1 -0
- package/dist/components/card-face/vocabulary.js +102 -0
- package/dist/components/card-face/vocabulary.js.map +1 -0
- package/dist/components/chart/BarList.js +78 -0
- package/dist/components/chart/BarList.js.map +1 -0
- package/dist/components/chart/LineChart.js +310 -0
- package/dist/components/chart/LineChart.js.map +1 -0
- package/dist/components/chart/ShareBar.js +141 -0
- package/dist/components/chart/ShareBar.js.map +1 -0
- package/dist/components/chart/TimeSeriesChart.js +305 -0
- package/dist/components/chart/TimeSeriesChart.js.map +1 -0
- package/dist/components/chart/label-metrics.js +17 -0
- package/dist/components/chart/label-metrics.js.map +1 -0
- package/dist/components/chart/line-chart-axis.js +38 -0
- package/dist/components/chart/line-chart-axis.js.map +1 -0
- package/dist/components/chart/line-chart-scale.js +132 -0
- package/dist/components/chart/line-chart-scale.js.map +1 -0
- package/dist/components/chart/line-series-style.js +22 -0
- package/dist/components/chart/line-series-style.js.map +1 -0
- package/dist/components/chart/share-bar-labels.js +14 -0
- package/dist/components/chart/share-bar-labels.js.map +1 -0
- package/dist/components/chart/shared.js +157 -0
- package/dist/components/chart/shared.js.map +1 -0
- package/dist/components/chart/time-series-scale.js +51 -0
- package/dist/components/chart/time-series-scale.js.map +1 -0
- package/dist/components/chat/Attachment.js +316 -0
- package/dist/components/chat/Attachment.js.map +1 -0
- package/dist/components/chat/Chat.js +171 -0
- package/dist/components/chat/Chat.js.map +1 -0
- package/dist/components/chat/Composer.js +274 -0
- package/dist/components/chat/Composer.js.map +1 -0
- package/dist/components/chat/ContextMeter.js +202 -0
- package/dist/components/chat/ContextMeter.js.map +1 -0
- package/dist/components/chat/EffortControl.js +116 -0
- package/dist/components/chat/EffortControl.js.map +1 -0
- package/dist/components/chat/FileCover.js +78 -0
- package/dist/components/chat/FileCover.js.map +1 -0
- package/dist/components/chat/Message.js +356 -0
- package/dist/components/chat/Message.js.map +1 -0
- package/dist/components/chat/MessageScroller.js +104 -0
- package/dist/components/chat/MessageScroller.js.map +1 -0
- package/dist/components/chat/ModelSelector.js +156 -0
- package/dist/components/chat/ModelSelector.js.map +1 -0
- package/dist/components/chat/StreamingMarkdown.js +42 -0
- package/dist/components/chat/StreamingMarkdown.js.map +1 -0
- package/dist/components/chat/download-file.js +9 -0
- package/dist/components/chat/download-file.js.map +1 -0
- package/dist/components/chat/file-icon.js +39 -0
- package/dist/components/chat/file-icon.js.map +1 -0
- package/dist/components/checklist/StatusChecklist.js +103 -0
- package/dist/components/checklist/StatusChecklist.js.map +1 -0
- package/dist/components/checklist/tally.js +29 -0
- package/dist/components/checklist/tally.js.map +1 -0
- package/dist/components/code-editor/context.js +13 -0
- package/dist/components/code-editor/context.js.map +1 -0
- package/dist/components/code-editor/editing.js +93 -0
- package/dist/components/code-editor/editing.js.map +1 -0
- package/dist/components/code-editor/highlight.js +27 -0
- package/dist/components/code-editor/highlight.js.map +1 -0
- package/dist/components/code-editor/recipe.js +75 -0
- package/dist/components/code-editor/recipe.js.map +1 -0
- package/dist/components/date-timeline/DateTimeline.js +358 -0
- package/dist/components/date-timeline/DateTimeline.js.map +1 -0
- package/dist/components/date-timeline/TimelineRow.js +100 -0
- package/dist/components/date-timeline/TimelineRow.js.map +1 -0
- package/dist/components/date-timeline/useBarDrag.js +44 -0
- package/dist/components/date-timeline/useBarDrag.js.map +1 -0
- package/dist/components/date-timeline/useMarkerDrag.js +40 -0
- package/dist/components/date-timeline/useMarkerDrag.js.map +1 -0
- package/dist/components/date-timeline/useTimelineZoom.js +44 -0
- package/dist/components/date-timeline/useTimelineZoom.js.map +1 -0
- package/dist/components/drag-drop/context.js +37 -0
- package/dist/components/drag-drop/context.js.map +1 -0
- package/dist/components/drag-drop/recipe.js +270 -0
- package/dist/components/drag-drop/recipe.js.map +1 -0
- package/dist/components/drag-drop/shift.js +157 -0
- package/dist/components/drag-drop/shift.js.map +1 -0
- package/dist/components/edit/activation.js +10 -0
- package/dist/components/edit/activation.js.map +1 -0
- package/dist/components/edit/outcome.js +47 -0
- package/dist/components/edit/outcome.js.map +1 -0
- package/dist/components/edit/use-edit-session.js +146 -0
- package/dist/components/edit/use-edit-session.js.map +1 -0
- package/dist/components/file-viewer/FileViewer.js +97 -0
- package/dist/components/file-viewer/FileViewer.js.map +1 -0
- package/dist/components/file-viewer/PageNumberJumpField.js +47 -0
- package/dist/components/file-viewer/PageNumberJumpField.js.map +1 -0
- package/dist/components/file-viewer/ViewerControls.js +122 -0
- package/dist/components/file-viewer/ViewerControls.js.map +1 -0
- package/dist/components/file-viewer/ViewerRail.js +57 -0
- package/dist/components/file-viewer/ViewerRail.js.map +1 -0
- package/dist/components/file-viewer/ViewerStage.js +112 -0
- package/dist/components/file-viewer/ViewerStage.js.map +1 -0
- package/dist/components/file-viewer/frames.js +37 -0
- package/dist/components/file-viewer/frames.js.map +1 -0
- package/dist/components/file-viewer/use-frame-cursor.js +32 -0
- package/dist/components/file-viewer/use-frame-cursor.js.map +1 -0
- package/dist/components/file-viewer/use-viewer-keys.js +50 -0
- package/dist/components/file-viewer/use-viewer-keys.js.map +1 -0
- package/dist/components/file-viewer/use-viewer-zoom.js +68 -0
- package/dist/components/file-viewer/use-viewer-zoom.js.map +1 -0
- package/dist/components/focus-web/FocusWeb.js +322 -0
- package/dist/components/focus-web/FocusWeb.js.map +1 -0
- package/dist/components/focus-web/layout.js +34 -0
- package/dist/components/focus-web/layout.js.map +1 -0
- package/dist/components/graph-explorer/GraphExplorer.js +441 -0
- package/dist/components/graph-explorer/GraphExplorer.js.map +1 -0
- package/dist/components/graph-explorer/camera-math.js +102 -0
- package/dist/components/graph-explorer/camera-math.js.map +1 -0
- package/dist/components/graph-explorer/tree-layout.js +103 -0
- package/dist/components/graph-explorer/tree-layout.js.map +1 -0
- package/dist/components/graph-explorer/use-camera.js +82 -0
- package/dist/components/graph-explorer/use-camera.js.map +1 -0
- package/dist/components/graph-explorer/viewport-gesture.js +107 -0
- package/dist/components/graph-explorer/viewport-gesture.js.map +1 -0
- package/dist/components/kanban/KanbanBoard.js +219 -0
- package/dist/components/kanban/KanbanBoard.js.map +1 -0
- package/dist/components/kanban/recipe.js +144 -0
- package/dist/components/kanban/recipe.js.map +1 -0
- package/dist/components/markdown/Affordances.js +398 -0
- package/dist/components/markdown/Affordances.js.map +1 -0
- package/dist/components/markdown/AttachmentStrip.js +128 -0
- package/dist/components/markdown/AttachmentStrip.js.map +1 -0
- package/dist/components/markdown/ImageUpload.js +45 -0
- package/dist/components/markdown/ImageUpload.js.map +1 -0
- package/dist/components/media-error.js +7 -0
- package/dist/components/media-error.js.map +1 -0
- package/dist/components/nav-sections.js +61 -0
- package/dist/components/nav-sections.js.map +1 -0
- package/dist/components/node-canvas/NodeCanvas.js +384 -0
- package/dist/components/node-canvas/NodeCanvas.js.map +1 -0
- package/dist/components/node-canvas/layout.js +237 -0
- package/dist/components/node-canvas/layout.js.map +1 -0
- package/dist/components/node-canvas/use-canvas-gestures.js +143 -0
- package/dist/components/node-canvas/use-canvas-gestures.js.map +1 -0
- package/dist/components/openapi/OpenApiViewer.js +137 -0
- package/dist/components/openapi/OpenApiViewer.js.map +1 -0
- package/dist/components/openapi/OperationCard.js +145 -0
- package/dist/components/openapi/OperationCard.js.map +1 -0
- package/dist/components/openapi/SchemaView.js +68 -0
- package/dist/components/openapi/SchemaView.js.map +1 -0
- package/dist/components/openapi/resolve.js +102 -0
- package/dist/components/openapi/resolve.js.map +1 -0
- package/dist/components/openapi/types.js +5 -0
- package/dist/components/openapi/types.js.map +1 -0
- package/dist/components/overlay-shell.js +29 -0
- package/dist/components/overlay-shell.js.map +1 -0
- package/dist/components/overlay-stack.js +27 -0
- package/dist/components/overlay-stack.js.map +1 -0
- package/dist/components/paged-window/PageBlock.js +50 -0
- package/dist/components/paged-window/PageBlock.js.map +1 -0
- package/dist/components/provenance/ConfidenceBar.js +60 -0
- package/dist/components/provenance/ConfidenceBar.js.map +1 -0
- package/dist/components/provenance/ConfidenceMeter.js +36 -0
- package/dist/components/provenance/ConfidenceMeter.js.map +1 -0
- package/dist/components/provenance/ConfidenceReadout.js +31 -0
- package/dist/components/provenance/ConfidenceReadout.js.map +1 -0
- package/dist/components/provenance/ProvenanceBadge.js +44 -0
- package/dist/components/provenance/ProvenanceBadge.js.map +1 -0
- package/dist/components/provenance/ProvenanceDetail.js +114 -0
- package/dist/components/provenance/ProvenanceDetail.js.map +1 -0
- package/dist/components/provenance/ProvenanceDisclosure.js +111 -0
- package/dist/components/provenance/ProvenanceDisclosure.js.map +1 -0
- package/dist/components/provenance/absence.js +31 -0
- package/dist/components/provenance/absence.js.map +1 -0
- package/dist/components/provenance/types.js +30 -0
- package/dist/components/provenance/types.js.map +1 -0
- package/dist/components/rbac/AccessRequestPanel.js +153 -0
- package/dist/components/rbac/AccessRequestPanel.js.map +1 -0
- package/dist/components/rbac/AccountMenu.js +118 -0
- package/dist/components/rbac/AccountMenu.js.map +1 -0
- package/dist/components/rbac/AgentKeysList.js +20 -0
- package/dist/components/rbac/AgentKeysList.js.map +1 -0
- package/dist/components/rbac/ApiKeysPanel.js +172 -0
- package/dist/components/rbac/ApiKeysPanel.js.map +1 -0
- package/dist/components/rbac/ApiKeysTable.js +169 -0
- package/dist/components/rbac/ApiKeysTable.js.map +1 -0
- package/dist/components/rbac/Brand.js +13 -0
- package/dist/components/rbac/Brand.js.map +1 -0
- package/dist/components/rbac/Can.js +18 -0
- package/dist/components/rbac/Can.js.map +1 -0
- package/dist/components/rbac/ChangePasswordForm.js +73 -0
- package/dist/components/rbac/ChangePasswordForm.js.map +1 -0
- package/dist/components/rbac/DangerZone.js +27 -0
- package/dist/components/rbac/DangerZone.js.map +1 -0
- package/dist/components/rbac/DevToolsPopover.js +140 -0
- package/dist/components/rbac/DevToolsPopover.js.map +1 -0
- package/dist/components/rbac/EndedLine.js +24 -0
- package/dist/components/rbac/EndedLine.js.map +1 -0
- package/dist/components/rbac/InvitationsList.js +148 -0
- package/dist/components/rbac/InvitationsList.js.map +1 -0
- package/dist/components/rbac/InviteMembersDialog.js +97 -0
- package/dist/components/rbac/InviteMembersDialog.js.map +1 -0
- package/dist/components/rbac/MembersPanel.js +138 -0
- package/dist/components/rbac/MembersPanel.js.map +1 -0
- package/dist/components/rbac/PermissionRequestPanel.js +141 -0
- package/dist/components/rbac/PermissionRequestPanel.js.map +1 -0
- package/dist/components/rbac/ProfileForm.js +86 -0
- package/dist/components/rbac/ProfileForm.js.map +1 -0
- package/dist/components/rbac/ProfilePage.js +58 -0
- package/dist/components/rbac/ProfilePage.js.map +1 -0
- package/dist/components/rbac/RBACProvider.js +82 -0
- package/dist/components/rbac/RBACProvider.js.map +1 -0
- package/dist/components/rbac/RoleEditorDialog.js +90 -0
- package/dist/components/rbac/RoleEditorDialog.js.map +1 -0
- package/dist/components/rbac/RoleKeyPicker.js +77 -0
- package/dist/components/rbac/RoleKeyPicker.js.map +1 -0
- package/dist/components/rbac/RolePermissionMatrix.js +37 -0
- package/dist/components/rbac/RolePermissionMatrix.js.map +1 -0
- package/dist/components/rbac/RolesPermissionsPage.js +142 -0
- package/dist/components/rbac/RolesPermissionsPage.js.map +1 -0
- package/dist/components/rbac/SessionsList.js +146 -0
- package/dist/components/rbac/SessionsList.js.map +1 -0
- package/dist/components/rbac/TeamSettingsForm.js +69 -0
- package/dist/components/rbac/TeamSettingsForm.js.map +1 -0
- package/dist/components/rbac/TeamSwitcher.js +66 -0
- package/dist/components/rbac/TeamSwitcher.js.map +1 -0
- package/dist/components/rbac/approvalPanelParts.js +130 -0
- package/dist/components/rbac/approvalPanelParts.js.map +1 -0
- package/dist/components/rbac/permissionSections.js +8 -0
- package/dist/components/rbac/permissionSections.js.map +1 -0
- package/dist/components/rbac/stagedForm.js +42 -0
- package/dist/components/rbac/stagedForm.js.map +1 -0
- package/dist/components/rbac/useStagedImage.js +21 -0
- package/dist/components/rbac/useStagedImage.js.map +1 -0
- package/dist/components/roadmap/PhaseManager.js +48 -0
- package/dist/components/roadmap/PhaseManager.js.map +1 -0
- package/dist/components/roadmap/RoadmapItemCard.js +96 -0
- package/dist/components/roadmap/RoadmapItemCard.js.map +1 -0
- package/dist/components/roadmap/RoadmapPage.js +34 -0
- package/dist/components/roadmap/RoadmapPage.js.map +1 -0
- package/dist/components/roadmap/RoadmapSwimlaneBoard.js +91 -0
- package/dist/components/roadmap/RoadmapSwimlaneBoard.js.map +1 -0
- package/dist/components/roadmap/TrackManager.js +58 -0
- package/dist/components/roadmap/TrackManager.js.map +1 -0
- package/dist/components/roadmap/UseCaseCard.js +93 -0
- package/dist/components/roadmap/UseCaseCard.js.map +1 -0
- package/dist/components/roadmap/UseCaseLedgerPage.js +98 -0
- package/dist/components/roadmap/UseCaseLedgerPage.js.map +1 -0
- package/dist/components/roadmap/chip-tones.js +9 -0
- package/dist/components/roadmap/chip-tones.js.map +1 -0
- package/dist/components/roadmap/derive.js +28 -0
- package/dist/components/roadmap/derive.js.map +1 -0
- package/dist/components/stepper/Stepper.js +276 -0
- package/dist/components/stepper/Stepper.js.map +1 -0
- package/dist/components/stepper/derive.js +53 -0
- package/dist/components/stepper/derive.js.map +1 -0
- package/dist/confidence.css +222 -0
- package/dist/fonts/bricolage-grotesque-0.woff2 +0 -0
- package/dist/fonts/bricolage-grotesque-1.woff2 +0 -0
- package/dist/fonts/bricolage-grotesque-2.woff2 +0 -0
- package/dist/fonts/figtree-0.woff2 +0 -0
- package/dist/fonts/figtree-1.woff2 +0 -0
- package/dist/fonts/figtree-2.woff2 +0 -0
- package/dist/fonts/figtree-3.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-0.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-1.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-10.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-11.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-2.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-3.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-4.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-5.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-6.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-7.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-8.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-9.woff2 +0 -0
- package/dist/fonts.css +187 -0
- package/dist/icons/data.js +233 -0
- package/dist/icons/data.js.map +1 -0
- package/dist/index.js +942 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/attention.js +75 -0
- package/dist/lib/attention.js.map +1 -0
- package/dist/lib/board/anchor.js +14 -0
- package/dist/lib/board/anchor.js.map +1 -0
- package/dist/lib/board/model.js +41 -0
- package/dist/lib/board/model.js.map +1 -0
- package/dist/lib/board/move.js +161 -0
- package/dist/lib/board/move.js.map +1 -0
- package/dist/lib/board/position.js +11 -0
- package/dist/lib/board/position.js.map +1 -0
- package/dist/lib/board/rejection.js +22 -0
- package/dist/lib/board/rejection.js.map +1 -0
- package/dist/lib/board/use-board.js +43 -0
- package/dist/lib/board/use-board.js.map +1 -0
- package/dist/lib/calendar/band-packer.js +44 -0
- package/dist/lib/calendar/band-packer.js.map +1 -0
- package/dist/lib/calendar/drag.js +74 -0
- package/dist/lib/calendar/drag.js.map +1 -0
- package/dist/lib/calendar/lane-packer.js +67 -0
- package/dist/lib/calendar/lane-packer.js.map +1 -0
- package/dist/lib/calendar/segments.js +82 -0
- package/dist/lib/calendar/segments.js.map +1 -0
- package/dist/lib/calendar/types.js +7 -0
- package/dist/lib/calendar/types.js.map +1 -0
- package/dist/lib/chart-palette.js +27 -0
- package/dist/lib/chart-palette.js.map +1 -0
- package/dist/lib/clipboard.js +30 -0
- package/dist/lib/clipboard.js.map +1 -0
- package/dist/lib/cn.js +9 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/color.js +24 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/lib/component-guidance.js +297 -0
- package/dist/lib/component-guidance.js.map +1 -0
- package/dist/lib/confidence.js +22 -0
- package/dist/lib/confidence.js.map +1 -0
- package/dist/lib/date-timeline/scale.js +197 -0
- package/dist/lib/date-timeline/scale.js.map +1 -0
- package/dist/lib/design-frame/document.js +44 -0
- package/dist/lib/design-frame/document.js.map +1 -0
- package/dist/lib/design-frame/mini-app-script.js +107 -0
- package/dist/lib/design-frame/mini-app-script.js.map +1 -0
- package/dist/lib/design-frame/mini-app.js +12 -0
- package/dist/lib/design-frame/mini-app.js.map +1 -0
- package/dist/lib/design-frame/protocol.js +46 -0
- package/dist/lib/design-frame/protocol.js.map +1 -0
- package/dist/lib/dev-warn.js +17 -0
- package/dist/lib/dev-warn.js.map +1 -0
- package/dist/lib/dnd/announce.js +120 -0
- package/dist/lib/dnd/announce.js.map +1 -0
- package/dist/lib/dnd/autoscroll.js +123 -0
- package/dist/lib/dnd/autoscroll.js.map +1 -0
- package/dist/lib/dnd/cross-drop.js +11 -0
- package/dist/lib/dnd/cross-drop.js.map +1 -0
- package/dist/lib/dnd/geometry.js +99 -0
- package/dist/lib/dnd/geometry.js.map +1 -0
- package/dist/lib/dnd/sensors/gesture.js +86 -0
- package/dist/lib/dnd/sensors/gesture.js.map +1 -0
- package/dist/lib/dnd/sensors/keyboard.js +47 -0
- package/dist/lib/dnd/sensors/keyboard.js.map +1 -0
- package/dist/lib/dnd/sensors/pointer.js +32 -0
- package/dist/lib/dnd/sensors/pointer.js.map +1 -0
- package/dist/lib/dnd/session.js +256 -0
- package/dist/lib/dnd/session.js.map +1 -0
- package/dist/lib/dnd/use-drag.js +90 -0
- package/dist/lib/dnd/use-drag.js.map +1 -0
- package/dist/lib/dom/scroll-ancestor.js +18 -0
- package/dist/lib/dom/scroll-ancestor.js.map +1 -0
- package/dist/lib/format.js +23 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/group-in-order.js +13 -0
- package/dist/lib/group-in-order.js.map +1 -0
- package/dist/lib/header-fold.js +11 -0
- package/dist/lib/header-fold.js.map +1 -0
- package/dist/lib/i18n/areas/auth-provenance-flows.js +156 -0
- package/dist/lib/i18n/areas/auth-provenance-flows.js.map +1 -0
- package/dist/lib/i18n/areas/board.js +35 -0
- package/dist/lib/i18n/areas/board.js.map +1 -0
- package/dist/lib/i18n/areas/card-face.js +10 -0
- package/dist/lib/i18n/areas/card-face.js.map +1 -0
- package/dist/lib/i18n/areas/chat-chart.js +118 -0
- package/dist/lib/i18n/areas/chat-chart.js.map +1 -0
- package/dist/lib/i18n/areas/code-editor.js +24 -0
- package/dist/lib/i18n/areas/code-editor.js.map +1 -0
- package/dist/lib/i18n/areas/date-timeline.js +21 -0
- package/dist/lib/i18n/areas/date-timeline.js.map +1 -0
- package/dist/lib/i18n/areas/dates.js +71 -0
- package/dist/lib/i18n/areas/dates.js.map +1 -0
- package/dist/lib/i18n/areas/docs-views.js +183 -0
- package/dist/lib/i18n/areas/docs-views.js.map +1 -0
- package/dist/lib/i18n/areas/feedback.js +75 -0
- package/dist/lib/i18n/areas/feedback.js.map +1 -0
- package/dist/lib/i18n/areas/formats.js +24 -0
- package/dist/lib/i18n/areas/formats.js.map +1 -0
- package/dist/lib/i18n/areas/forms.js +110 -0
- package/dist/lib/i18n/areas/forms.js.map +1 -0
- package/dist/lib/i18n/areas/keys.js +25 -0
- package/dist/lib/i18n/areas/keys.js.map +1 -0
- package/dist/lib/i18n/areas/markdown.js +136 -0
- package/dist/lib/i18n/areas/markdown.js.map +1 -0
- package/dist/lib/i18n/areas/move-rejected.js +14 -0
- package/dist/lib/i18n/areas/move-rejected.js.map +1 -0
- package/dist/lib/i18n/areas/navigation.js +104 -0
- package/dist/lib/i18n/areas/navigation.js.map +1 -0
- package/dist/lib/i18n/areas/rbac.js +332 -0
- package/dist/lib/i18n/areas/rbac.js.map +1 -0
- package/dist/lib/i18n/emphasis.js +6 -0
- package/dist/lib/i18n/emphasis.js.map +1 -0
- package/dist/lib/i18n/number-format.js +9 -0
- package/dist/lib/i18n/number-format.js.map +1 -0
- package/dist/lib/i18n/plural.js +9 -0
- package/dist/lib/i18n/plural.js.map +1 -0
- package/dist/lib/i18n/provider.js +27 -0
- package/dist/lib/i18n/provider.js.map +1 -0
- package/dist/lib/i18n/strings.js +38 -0
- package/dist/lib/i18n/strings.js.map +1 -0
- package/dist/lib/icons.js +17 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/interactive-target.js +9 -0
- package/dist/lib/interactive-target.js.map +1 -0
- package/dist/lib/intl-cache.js +69 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/legal-document.js +37 -0
- package/dist/lib/legal-document.js.map +1 -0
- package/dist/lib/line-diff-model.js +51 -0
- package/dist/lib/line-diff-model.js.map +1 -0
- package/dist/lib/markdown/attachments.js +71 -0
- package/dist/lib/markdown/attachments.js.map +1 -0
- package/dist/lib/markdown/caret-map.js +153 -0
- package/dist/lib/markdown/caret-map.js.map +1 -0
- package/dist/lib/markdown/caret.js +35 -0
- package/dist/lib/markdown/caret.js.map +1 -0
- package/dist/lib/markdown/commands.js +443 -0
- package/dist/lib/markdown/commands.js.map +1 -0
- package/dist/lib/markdown/convert.js +153 -0
- package/dist/lib/markdown/convert.js.map +1 -0
- package/dist/lib/markdown/dom.js +89 -0
- package/dist/lib/markdown/dom.js.map +1 -0
- package/dist/lib/markdown/edit.js +92 -0
- package/dist/lib/markdown/edit.js.map +1 -0
- package/dist/lib/markdown/history.js +79 -0
- package/dist/lib/markdown/history.js.map +1 -0
- package/dist/lib/markdown/hotkeys.js +63 -0
- package/dist/lib/markdown/hotkeys.js.map +1 -0
- package/dist/lib/markdown/image-pipeline.js +236 -0
- package/dist/lib/markdown/image-pipeline.js.map +1 -0
- package/dist/lib/markdown/images.js +85 -0
- package/dist/lib/markdown/images.js.map +1 -0
- package/dist/lib/markdown/input.js +210 -0
- package/dist/lib/markdown/input.js.map +1 -0
- package/dist/lib/markdown/keys.js +37 -0
- package/dist/lib/markdown/keys.js.map +1 -0
- package/dist/lib/markdown/paste.js +180 -0
- package/dist/lib/markdown/paste.js.map +1 -0
- package/dist/lib/markdown/position.js +111 -0
- package/dist/lib/markdown/position.js.map +1 -0
- package/dist/lib/markdown/project.js +108 -0
- package/dist/lib/markdown/project.js.map +1 -0
- package/dist/lib/markdown/reconcile.js +127 -0
- package/dist/lib/markdown/reconcile.js.map +1 -0
- package/dist/lib/markdown/surface.js +373 -0
- package/dist/lib/markdown/surface.js.map +1 -0
- package/dist/lib/motion.js +22 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/pad.js +7 -0
- package/dist/lib/pad.js.map +1 -0
- package/dist/lib/paged-window/layout.js +15 -0
- package/dist/lib/paged-window/layout.js.map +1 -0
- package/dist/lib/paged-window/list-owner.js +21 -0
- package/dist/lib/paged-window/list-owner.js.map +1 -0
- package/dist/lib/paged-window/records-binding.js +239 -0
- package/dist/lib/paged-window/records-binding.js.map +1 -0
- package/dist/lib/paged-window/store.js +562 -0
- package/dist/lib/paged-window/store.js.map +1 -0
- package/dist/lib/paged-window/use-measured-pitch.js +38 -0
- package/dist/lib/paged-window/use-measured-pitch.js.map +1 -0
- package/dist/lib/paged-window/use-page-visibility.js +36 -0
- package/dist/lib/paged-window/use-page-visibility.js.map +1 -0
- package/dist/lib/paged-window/use-paged-window.js +43 -0
- package/dist/lib/paged-window/use-paged-window.js.map +1 -0
- package/dist/lib/paged-window/use-scroll-root.js +12 -0
- package/dist/lib/paged-window/use-scroll-root.js.map +1 -0
- package/dist/lib/persist.js +84 -0
- package/dist/lib/persist.js.map +1 -0
- package/dist/lib/preference-values.js +13 -0
- package/dist/lib/preference-values.js.map +1 -0
- package/dist/lib/preferences.js +86 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/reads/hooks.js +156 -0
- package/dist/lib/reads/hooks.js.map +1 -0
- package/dist/lib/reads/optimistic.js +169 -0
- package/dist/lib/reads/optimistic.js.map +1 -0
- package/dist/lib/reads/refetch.js +108 -0
- package/dist/lib/reads/refetch.js.map +1 -0
- package/dist/lib/reads/slots.js +215 -0
- package/dist/lib/reads/slots.js.map +1 -0
- package/dist/lib/realtime/hooks.js +40 -0
- package/dist/lib/realtime/hooks.js.map +1 -0
- package/dist/lib/realtime/provider.js +25 -0
- package/dist/lib/realtime/provider.js.map +1 -0
- package/dist/lib/realtime/registry.js +472 -0
- package/dist/lib/realtime/registry.js.map +1 -0
- package/dist/lib/records/define-record-type.js +33 -0
- package/dist/lib/records/define-record-type.js.map +1 -0
- package/dist/lib/records/hooks.js +39 -0
- package/dist/lib/records/hooks.js.map +1 -0
- package/dist/lib/records/store.js +572 -0
- package/dist/lib/records/store.js.map +1 -0
- package/dist/lib/records/wire.js +58 -0
- package/dist/lib/records/wire.js.map +1 -0
- package/dist/lib/reduced-motion-help.js +19 -0
- package/dist/lib/reduced-motion-help.js.map +1 -0
- package/dist/lib/scroll-caret.js +18 -0
- package/dist/lib/scroll-caret.js.map +1 -0
- package/dist/lib/sim/createSimStore.js +54 -0
- package/dist/lib/sim/createSimStore.js.map +1 -0
- package/dist/lib/sim/latency.js +28 -0
- package/dist/lib/sim/latency.js.map +1 -0
- package/dist/lib/sim/registry.js +13 -0
- package/dist/lib/sim/registry.js.map +1 -0
- package/dist/lib/sim/settings.js +41 -0
- package/dist/lib/sim/settings.js.map +1 -0
- package/dist/lib/submit-shortcut.js +25 -0
- package/dist/lib/submit-shortcut.js.map +1 -0
- package/dist/lib/syntax/index.js +33 -0
- package/dist/lib/syntax/index.js.map +1 -0
- package/dist/lib/syntax/languages/bash.js +77 -0
- package/dist/lib/syntax/languages/bash.js.map +1 -0
- package/dist/lib/syntax/languages/css.js +81 -0
- package/dist/lib/syntax/languages/css.js.map +1 -0
- package/dist/lib/syntax/languages/html.js +91 -0
- package/dist/lib/syntax/languages/html.js.map +1 -0
- package/dist/lib/syntax/languages/index.js +49 -0
- package/dist/lib/syntax/languages/index.js.map +1 -0
- package/dist/lib/syntax/languages/javascript.js +133 -0
- package/dist/lib/syntax/languages/javascript.js.map +1 -0
- package/dist/lib/syntax/languages/json.js +45 -0
- package/dist/lib/syntax/languages/json.js.map +1 -0
- package/dist/lib/syntax/languages/mongodb.js +24 -0
- package/dist/lib/syntax/languages/mongodb.js.map +1 -0
- package/dist/lib/syntax/languages/plain.js +10 -0
- package/dist/lib/syntax/languages/plain.js.map +1 -0
- package/dist/lib/syntax/languages/sql.js +113 -0
- package/dist/lib/syntax/languages/sql.js.map +1 -0
- package/dist/lib/syntax/languages/vue.js +31 -0
- package/dist/lib/syntax/languages/vue.js.map +1 -0
- package/dist/lib/syntax/languages/yaml.js +55 -0
- package/dist/lib/syntax/languages/yaml.js.map +1 -0
- package/dist/lib/syntax/markdown/grammar.js +52 -0
- package/dist/lib/syntax/markdown/grammar.js.map +1 -0
- package/dist/lib/syntax/markdown/inline.js +477 -0
- package/dist/lib/syntax/markdown/inline.js.map +1 -0
- package/dist/lib/syntax/markdown/parse.js +464 -0
- package/dist/lib/syntax/markdown/parse.js.map +1 -0
- package/dist/lib/syntax/markdown/refs.js +94 -0
- package/dist/lib/syntax/markdown/refs.js.map +1 -0
- package/dist/lib/syntax/markdown/render.js +230 -0
- package/dist/lib/syntax/markdown/render.js.map +1 -0
- package/dist/lib/syntax/markdown/spans.js +40 -0
- package/dist/lib/syntax/markdown/spans.js.map +1 -0
- package/dist/lib/syntax/registry.js +55 -0
- package/dist/lib/syntax/registry.js.map +1 -0
- package/dist/lib/syntax/tokenize.js +96 -0
- package/dist/lib/syntax/tokenize.js.map +1 -0
- package/dist/lib/time/instant.js +7 -0
- package/dist/lib/time/instant.js.map +1 -0
- package/dist/lib/time/plain.js +83 -0
- package/dist/lib/time/plain.js.map +1 -0
- package/dist/lib/time/relativeAge.js +20 -0
- package/dist/lib/time/relativeAge.js.map +1 -0
- package/dist/lib/time/relativeClock.js +59 -0
- package/dist/lib/time/relativeClock.js.map +1 -0
- package/dist/lib/time/types.js +23 -0
- package/dist/lib/time/types.js.map +1 -0
- package/dist/lib/time/zone.js +148 -0
- package/dist/lib/time/zone.js.map +1 -0
- package/dist/lib/use-controllable.js +16 -0
- package/dist/lib/use-controllable.js.map +1 -0
- package/dist/lib/use-fill-height.js +49 -0
- package/dist/lib/use-fill-height.js.map +1 -0
- package/dist/lib/use-hydrated.js +14 -0
- package/dist/lib/use-hydrated.js.map +1 -0
- package/dist/lib/use-media-query.js +30 -0
- package/dist/lib/use-media-query.js.map +1 -0
- package/dist/lib/use-relabel-base-ui-dismiss.js +26 -0
- package/dist/lib/use-relabel-base-ui-dismiss.js.map +1 -0
- package/dist/lib/use-release-snap-drag.js +29 -0
- package/dist/lib/use-release-snap-drag.js.map +1 -0
- package/dist/lib/use-roving-options.js +18 -0
- package/dist/lib/use-roving-options.js.map +1 -0
- package/dist/lib/values/absent.js +5 -0
- package/dist/lib/values/absent.js.map +1 -0
- package/dist/lib/values/boolean.js +13 -0
- package/dist/lib/values/boolean.js.map +1 -0
- package/dist/lib/values/currency.js +23 -0
- package/dist/lib/values/currency.js.map +1 -0
- package/dist/lib/values/date.js +35 -0
- package/dist/lib/values/date.js.map +1 -0
- package/dist/lib/values/datetime.js +54 -0
- package/dist/lib/values/datetime.js.map +1 -0
- package/dist/lib/values/locale-date.js +60 -0
- package/dist/lib/values/locale-date.js.map +1 -0
- package/dist/lib/values/number.js +16 -0
- package/dist/lib/values/number.js.map +1 -0
- package/dist/pure.js +379 -0
- package/dist/pure.js.map +1 -0
- package/dist/styles.css +190 -0
- package/dist/theme.css +360 -0
- package/dist/types/components/Accordion.d.ts +15 -0
- package/dist/types/components/AgentWorkingSpinner.d.ts +23 -0
- package/dist/types/components/AppShell.d.ts +164 -0
- package/dist/types/components/Attention.d.ts +87 -0
- package/dist/types/components/Avatar.d.ts +154 -0
- package/dist/types/components/Badge.d.ts +131 -0
- package/dist/types/components/Board.d.ts +239 -0
- package/dist/types/components/Button.d.ts +208 -0
- package/dist/types/components/Callout.d.ts +163 -0
- package/dist/types/components/Card.d.ts +219 -0
- package/dist/types/components/Choice.d.ts +127 -0
- package/dist/types/components/CodeEditor.d.ts +86 -0
- package/dist/types/components/ColorPicker.d.ts +14 -0
- package/dist/types/components/Combobox.d.ts +43 -0
- package/dist/types/components/CommandPalette.d.ts +35 -0
- package/dist/types/components/ConcentricRing.d.ts +61 -0
- package/dist/types/components/ConnectionCard.d.ts +64 -0
- package/dist/types/components/ContextItemRow.d.ts +35 -0
- package/dist/types/components/CopyValue.d.ts +14 -0
- package/dist/types/components/CountBadge.d.ts +14 -0
- package/dist/types/components/DateCalendar.d.ts +30 -0
- package/dist/types/components/DateField.d.ts +29 -0
- package/dist/types/components/DatePicker.d.ts +20 -0
- package/dist/types/components/DateTimeText.d.ts +9 -0
- package/dist/types/components/DescriptionList.d.ts +40 -0
- package/dist/types/components/Dialog.d.ts +269 -0
- package/dist/types/components/DragDrop.d.ts +196 -0
- package/dist/types/components/Drawer.d.ts +163 -0
- package/dist/types/components/EditGutter.d.ts +44 -0
- package/dist/types/components/EmojiPicker.d.ts +30 -0
- package/dist/types/components/ErrorBoundary.d.ts +43 -0
- package/dist/types/components/Field.d.ts +37 -0
- package/dist/types/components/FileUpload.d.ts +22 -0
- package/dist/types/components/FilterMenu.d.ts +120 -0
- package/dist/types/components/GatesSection.d.ts +79 -0
- package/dist/types/components/Icon.d.ts +40 -0
- package/dist/types/components/IconButton.d.ts +69 -0
- package/dist/types/components/IconStack.d.ts +28 -0
- package/dist/types/components/ImageUploadField.d.ts +38 -0
- package/dist/types/components/InlineEdit.d.ts +183 -0
- package/dist/types/components/InlineMarkdownEdit.d.ts +100 -0
- package/dist/types/components/Input.d.ts +128 -0
- package/dist/types/components/LegalDocument.d.ts +23 -0
- package/dist/types/components/LineDiff.d.ts +53 -0
- package/dist/types/components/ListHeader.d.ts +45 -0
- package/dist/types/components/Loading.d.ts +131 -0
- package/dist/types/components/Markdown.d.ts +35 -0
- package/dist/types/components/MarkdownEditor.d.ts +129 -0
- package/dist/types/components/Menu.d.ts +157 -0
- package/dist/types/components/Navigation.d.ts +67 -0
- package/dist/types/components/NumberInput.d.ts +177 -0
- package/dist/types/components/OTPInput.d.ts +13 -0
- package/dist/types/components/OrderedEntityManager.d.ts +64 -0
- package/dist/types/components/PagedWindowList.d.ts +23 -0
- package/dist/types/components/PaginationBar.d.ts +31 -0
- package/dist/types/components/Panel.d.ts +94 -0
- package/dist/types/components/PasswordInput.d.ts +7 -0
- package/dist/types/components/PasswordRequirements.d.ts +11 -0
- package/dist/types/components/PatchDiff.d.ts +38 -0
- package/dist/types/components/PendingVeil.d.ts +8 -0
- package/dist/types/components/Popover.d.ts +231 -0
- package/dist/types/components/Progress.d.ts +580 -0
- package/dist/types/components/RatingScale.d.ts +30 -0
- package/dist/types/components/ReadMore.d.ts +26 -0
- package/dist/types/components/RecordCard.d.ts +413 -0
- package/dist/types/components/RelativeTime.d.ts +17 -0
- package/dist/types/components/SandboxedFrame.d.ts +37 -0
- package/dist/types/components/SearchInput.d.ts +6 -0
- package/dist/types/components/SecretField.d.ts +90 -0
- package/dist/types/components/SectionNav.d.ts +15 -0
- package/dist/types/components/Select.d.ts +53 -0
- package/dist/types/components/SequenceDiagram.d.ts +15 -0
- package/dist/types/components/SettingRow.d.ts +144 -0
- package/dist/types/components/SignOffRings.d.ts +29 -0
- package/dist/types/components/Slider.d.ts +255 -0
- package/dist/types/components/SolutionChoice.d.ts +49 -0
- package/dist/types/components/SortMenu.d.ts +45 -0
- package/dist/types/components/Spinner.d.ts +29 -0
- package/dist/types/components/Stat.d.ts +136 -0
- package/dist/types/components/StatusSelect.d.ts +93 -0
- package/dist/types/components/Surface.d.ts +145 -0
- package/dist/types/components/Table.d.ts +164 -0
- package/dist/types/components/Tabs.d.ts +142 -0
- package/dist/types/components/ThemeMenu.d.ts +56 -0
- package/dist/types/components/Toast.d.ts +63 -0
- package/dist/types/components/Toggle.d.ts +168 -0
- package/dist/types/components/ToggleMatrix.d.ts +51 -0
- package/dist/types/components/Tree.d.ts +20 -0
- package/dist/types/components/TriStateSwitch.d.ts +63 -0
- package/dist/types/components/VideoPlayer.d.ts +26 -0
- package/dist/types/components/auth/AcceptInvitationCard.d.ts +54 -0
- package/dist/types/components/auth/AuthLayout.d.ts +12 -0
- package/dist/types/components/auth/ForgotPasswordForm.d.ts +6 -0
- package/dist/types/components/auth/LoginForm.d.ts +13 -0
- package/dist/types/components/auth/ResetPasswordForm.d.ts +9 -0
- package/dist/types/components/auth/SignInProviders.d.ts +56 -0
- package/dist/types/components/auth/SignupCard.d.ts +62 -0
- package/dist/types/components/auth/TermsAcceptance.d.ts +14 -0
- package/dist/types/components/auth/index.d.ts +8 -0
- package/dist/types/components/board/context.d.ts +65 -0
- package/dist/types/components/board/recipe.d.ts +97 -0
- package/dist/types/components/calendar/CalendarMonth.d.ts +32 -0
- package/dist/types/components/calendar/CalendarTimeGrid.d.ts +74 -0
- package/dist/types/components/calendar/EventActions.d.ts +16 -0
- package/dist/types/components/calendar/format.d.ts +42 -0
- package/dist/types/components/calendar/palette.d.ts +17 -0
- package/dist/types/components/calendar/use-calendar-drag.d.ts +53 -0
- package/dist/types/components/calendar/use-event-keyboard.d.ts +23 -0
- package/dist/types/components/calendar/use-grid-navigation.d.ts +47 -0
- package/dist/types/components/calendar/use-now.d.ts +20 -0
- package/dist/types/components/card-face/AcRingGlyph.d.ts +20 -0
- package/dist/types/components/card-face/BoardCardAgentSlot.d.ts +19 -0
- package/dist/types/components/card-face/CardFace.d.ts +106 -0
- package/dist/types/components/card-face/CardTypeBadge.d.ts +21 -0
- package/dist/types/components/card-face/EffortBadge.d.ts +9 -0
- package/dist/types/components/card-face/GateRingGlyph.d.ts +22 -0
- package/dist/types/components/card-face/OverflowRow.d.ts +40 -0
- package/dist/types/components/card-face/TapTip.d.ts +15 -0
- package/dist/types/components/card-face/hit-area.d.ts +20 -0
- package/dist/types/components/card-face/vocabulary.d.ts +83 -0
- package/dist/types/components/chart/BarList.d.ts +27 -0
- package/dist/types/components/chart/LineChart.d.ts +64 -0
- package/dist/types/components/chart/ShareBar.d.ts +26 -0
- package/dist/types/components/chart/TimeSeriesChart.d.ts +60 -0
- package/dist/types/components/chart/label-metrics.d.ts +9 -0
- package/dist/types/components/chart/line-chart-axis.d.ts +14 -0
- package/dist/types/components/chart/line-chart-scale.d.ts +55 -0
- package/dist/types/components/chart/line-series-style.d.ts +14 -0
- package/dist/types/components/chart/share-bar-labels.d.ts +17 -0
- package/dist/types/components/chart/shared.d.ts +122 -0
- package/dist/types/components/chart/time-series-scale.d.ts +29 -0
- package/dist/types/components/chat/Attachment.d.ts +125 -0
- package/dist/types/components/chat/Chat.d.ts +60 -0
- package/dist/types/components/chat/Composer.d.ts +62 -0
- package/dist/types/components/chat/ContextMeter.d.ts +45 -0
- package/dist/types/components/chat/EffortControl.d.ts +23 -0
- package/dist/types/components/chat/FileCover.d.ts +14 -0
- package/dist/types/components/chat/Message.d.ts +66 -0
- package/dist/types/components/chat/MessageScroller.d.ts +18 -0
- package/dist/types/components/chat/ModelSelector.d.ts +44 -0
- package/dist/types/components/chat/StreamingMarkdown.d.ts +11 -0
- package/dist/types/components/chat/download-file.d.ts +7 -0
- package/dist/types/components/chat/file-icon.d.ts +29 -0
- package/dist/types/components/chat/types.d.ts +165 -0
- package/dist/types/components/checklist/StatusChecklist.d.ts +37 -0
- package/dist/types/components/checklist/index.d.ts +3 -0
- package/dist/types/components/checklist/tally.d.ts +19 -0
- package/dist/types/components/checklist/types.d.ts +28 -0
- package/dist/types/components/code-editor/context.d.ts +32 -0
- package/dist/types/components/code-editor/editing.d.ts +39 -0
- package/dist/types/components/code-editor/highlight.d.ts +20 -0
- package/dist/types/components/code-editor/recipe.d.ts +109 -0
- package/dist/types/components/date-timeline/DateTimeline.d.ts +99 -0
- package/dist/types/components/date-timeline/TimelineRow.d.ts +22 -0
- package/dist/types/components/date-timeline/useBarDrag.d.ts +15 -0
- package/dist/types/components/date-timeline/useMarkerDrag.d.ts +14 -0
- package/dist/types/components/date-timeline/useTimelineZoom.d.ts +23 -0
- package/dist/types/components/drag-drop/context.d.ts +85 -0
- package/dist/types/components/drag-drop/recipe.d.ts +163 -0
- package/dist/types/components/drag-drop/shift.d.ts +153 -0
- package/dist/types/components/edit/activation.d.ts +21 -0
- package/dist/types/components/edit/outcome.d.ts +29 -0
- package/dist/types/components/edit/use-edit-session.d.ts +77 -0
- package/dist/types/components/file-viewer/FileViewer.d.ts +2 -0
- package/dist/types/components/file-viewer/PageNumberJumpField.d.ts +9 -0
- package/dist/types/components/file-viewer/ViewerControls.d.ts +20 -0
- package/dist/types/components/file-viewer/ViewerRail.d.ts +10 -0
- package/dist/types/components/file-viewer/ViewerStage.d.ts +22 -0
- package/dist/types/components/file-viewer/frames.d.ts +28 -0
- package/dist/types/components/file-viewer/index.d.ts +3 -0
- package/dist/types/components/file-viewer/types.d.ts +70 -0
- package/dist/types/components/file-viewer/use-frame-cursor.d.ts +13 -0
- package/dist/types/components/file-viewer/use-viewer-keys.d.ts +24 -0
- package/dist/types/components/file-viewer/use-viewer-zoom.d.ts +29 -0
- package/dist/types/components/focus-web/FocusWeb.d.ts +3 -0
- package/dist/types/components/focus-web/index.d.ts +4 -0
- package/dist/types/components/focus-web/layout.d.ts +55 -0
- package/dist/types/components/focus-web/types.d.ts +131 -0
- package/dist/types/components/graph-explorer/GraphExplorer.d.ts +42 -0
- package/dist/types/components/graph-explorer/camera-math.d.ts +119 -0
- package/dist/types/components/graph-explorer/index.d.ts +5 -0
- package/dist/types/components/graph-explorer/tree-layout.d.ts +67 -0
- package/dist/types/components/graph-explorer/types.d.ts +62 -0
- package/dist/types/components/graph-explorer/use-camera.d.ts +81 -0
- package/dist/types/components/graph-explorer/viewport-gesture.d.ts +32 -0
- package/dist/types/components/kanban/KanbanBoard.d.ts +72 -0
- package/dist/types/components/kanban/recipe.d.ts +73 -0
- package/dist/types/components/kanban/types.d.ts +55 -0
- package/dist/types/components/markdown/Affordances.d.ts +105 -0
- package/dist/types/components/markdown/AttachmentStrip.d.ts +25 -0
- package/dist/types/components/markdown/ImageUpload.d.ts +56 -0
- package/dist/types/components/media-error.d.ts +11 -0
- package/dist/types/components/nav-sections.d.ts +10 -0
- package/dist/types/components/node-canvas/NodeCanvas.d.ts +66 -0
- package/dist/types/components/node-canvas/index.d.ts +3 -0
- package/dist/types/components/node-canvas/layout.d.ts +29 -0
- package/dist/types/components/node-canvas/types.d.ts +207 -0
- package/dist/types/components/node-canvas/use-canvas-gestures.d.ts +39 -0
- package/dist/types/components/openapi/OpenApiViewer.d.ts +14 -0
- package/dist/types/components/openapi/OperationCard.d.ts +33 -0
- package/dist/types/components/openapi/SchemaView.d.ts +14 -0
- package/dist/types/components/openapi/index.d.ts +6 -0
- package/dist/types/components/openapi/resolve.d.ts +72 -0
- package/dist/types/components/openapi/types.d.ts +128 -0
- package/dist/types/components/overlay-shell.d.ts +48 -0
- package/dist/types/components/overlay-stack.d.ts +18 -0
- package/dist/types/components/paged-window/PageBlock.d.ts +31 -0
- package/dist/types/components/provenance/ConfidenceBar.d.ts +118 -0
- package/dist/types/components/provenance/ConfidenceMeter.d.ts +21 -0
- package/dist/types/components/provenance/ConfidenceReadout.d.ts +17 -0
- package/dist/types/components/provenance/ProvenanceBadge.d.ts +23 -0
- package/dist/types/components/provenance/ProvenanceDetail.d.ts +109 -0
- package/dist/types/components/provenance/ProvenanceDisclosure.d.ts +107 -0
- package/dist/types/components/provenance/absence.d.ts +37 -0
- package/dist/types/components/provenance/index.d.ts +7 -0
- package/dist/types/components/provenance/types.d.ts +137 -0
- package/dist/types/components/rbac/AccessRequestPanel.d.ts +92 -0
- package/dist/types/components/rbac/AccountMenu.d.ts +46 -0
- package/dist/types/components/rbac/AgentKeysList.d.ts +22 -0
- package/dist/types/components/rbac/ApiKeysPanel.d.ts +26 -0
- package/dist/types/components/rbac/ApiKeysTable.d.ts +65 -0
- package/dist/types/components/rbac/Brand.d.ts +8 -0
- package/dist/types/components/rbac/Can.d.ts +19 -0
- package/dist/types/components/rbac/ChangePasswordForm.d.ts +18 -0
- package/dist/types/components/rbac/DangerZone.d.ts +8 -0
- package/dist/types/components/rbac/DevToolsPopover.d.ts +36 -0
- package/dist/types/components/rbac/EndedLine.d.ts +21 -0
- package/dist/types/components/rbac/InvitationsList.d.ts +39 -0
- package/dist/types/components/rbac/InviteMembersDialog.d.ts +21 -0
- package/dist/types/components/rbac/MembersPanel.d.ts +31 -0
- package/dist/types/components/rbac/PermissionRequestPanel.d.ts +36 -0
- package/dist/types/components/rbac/ProfileForm.d.ts +27 -0
- package/dist/types/components/rbac/ProfilePage.d.ts +16 -0
- package/dist/types/components/rbac/RBACProvider.d.ts +69 -0
- package/dist/types/components/rbac/RoleEditorDialog.d.ts +28 -0
- package/dist/types/components/rbac/RoleKeyPicker.d.ts +24 -0
- package/dist/types/components/rbac/RolePermissionMatrix.d.ts +21 -0
- package/dist/types/components/rbac/RolesPermissionsPage.d.ts +24 -0
- package/dist/types/components/rbac/SessionsList.d.ts +35 -0
- package/dist/types/components/rbac/TeamSettingsForm.d.ts +22 -0
- package/dist/types/components/rbac/TeamSwitcher.d.ts +5 -0
- package/dist/types/components/rbac/approvalPanelParts.d.ts +69 -0
- package/dist/types/components/rbac/index.d.ts +25 -0
- package/dist/types/components/rbac/permissionSections.d.ts +8 -0
- package/dist/types/components/rbac/stagedForm.d.ts +25 -0
- package/dist/types/components/rbac/types.d.ts +65 -0
- package/dist/types/components/rbac/useStagedImage.d.ts +15 -0
- package/dist/types/components/roadmap/PhaseManager.d.ts +19 -0
- package/dist/types/components/roadmap/RoadmapItemCard.d.ts +51 -0
- package/dist/types/components/roadmap/RoadmapPage.d.ts +12 -0
- package/dist/types/components/roadmap/RoadmapSwimlaneBoard.d.ts +15 -0
- package/dist/types/components/roadmap/TrackManager.d.ts +19 -0
- package/dist/types/components/roadmap/UseCaseCard.d.ts +30 -0
- package/dist/types/components/roadmap/UseCaseLedgerPage.d.ts +29 -0
- package/dist/types/components/roadmap/chip-tones.d.ts +2 -0
- package/dist/types/components/roadmap/derive.d.ts +39 -0
- package/dist/types/components/roadmap/index.d.ts +10 -0
- package/dist/types/components/roadmap/types.d.ts +86 -0
- package/dist/types/components/stepper/Stepper.d.ts +79 -0
- package/dist/types/components/stepper/derive.d.ts +49 -0
- package/dist/types/components/stepper/index.d.ts +3 -0
- package/dist/types/components/stepper/types.d.ts +118 -0
- package/dist/types/icons/data.d.ts +2054 -0
- package/dist/types/index.d.ts +209 -0
- package/dist/types/lib/attention.d.ts +62 -0
- package/dist/types/lib/board/anchor.d.ts +69 -0
- package/dist/types/lib/board/index.d.ts +17 -0
- package/dist/types/lib/board/model.d.ts +43 -0
- package/dist/types/lib/board/move.d.ts +181 -0
- package/dist/types/lib/board/position.d.ts +22 -0
- package/dist/types/lib/board/rejection.d.ts +8 -0
- package/dist/types/lib/board/types.d.ts +294 -0
- package/dist/types/lib/board/use-board.d.ts +47 -0
- package/dist/types/lib/calendar/band-packer.d.ts +53 -0
- package/dist/types/lib/calendar/drag.d.ts +125 -0
- package/dist/types/lib/calendar/index.d.ts +4 -0
- package/dist/types/lib/calendar/lane-packer.d.ts +88 -0
- package/dist/types/lib/calendar/segments.d.ts +91 -0
- package/dist/types/lib/calendar/types.d.ts +166 -0
- package/dist/types/lib/chart-palette.d.ts +14 -0
- package/dist/types/lib/clipboard.d.ts +12 -0
- package/dist/types/lib/cn.d.ts +7 -0
- package/dist/types/lib/color.d.ts +14 -0
- package/dist/types/lib/component-guidance.d.ts +15 -0
- package/dist/types/lib/confidence.d.ts +28 -0
- package/dist/types/lib/date-timeline/scale.d.ts +143 -0
- package/dist/types/lib/design-frame/document.d.ts +39 -0
- package/dist/types/lib/design-frame/mini-app-script.d.ts +29 -0
- package/dist/types/lib/design-frame/mini-app.d.ts +17 -0
- package/dist/types/lib/design-frame/protocol.d.ts +78 -0
- package/dist/types/lib/dev-warn.d.ts +10 -0
- package/dist/types/lib/dnd/announce.d.ts +124 -0
- package/dist/types/lib/dnd/autoscroll.d.ts +88 -0
- package/dist/types/lib/dnd/cross-drop.d.ts +18 -0
- package/dist/types/lib/dnd/geometry.d.ts +126 -0
- package/dist/types/lib/dnd/index.d.ts +17 -0
- package/dist/types/lib/dnd/sensors/gesture.d.ts +37 -0
- package/dist/types/lib/dnd/sensors/keyboard.d.ts +54 -0
- package/dist/types/lib/dnd/sensors/pointer.d.ts +59 -0
- package/dist/types/lib/dnd/session.d.ts +124 -0
- package/dist/types/lib/dnd/types.d.ts +226 -0
- package/dist/types/lib/dnd/use-drag.d.ts +82 -0
- package/dist/types/lib/dom/scroll-ancestor.d.ts +15 -0
- package/dist/types/lib/format.d.ts +33 -0
- package/dist/types/lib/group-in-order.d.ts +13 -0
- package/dist/types/lib/header-fold.d.ts +10 -0
- package/dist/types/lib/i18n/areas/auth-provenance-flows.d.ts +287 -0
- package/dist/types/lib/i18n/areas/board.d.ts +51 -0
- package/dist/types/lib/i18n/areas/card-face.d.ts +8 -0
- package/dist/types/lib/i18n/areas/chat-chart.d.ts +202 -0
- package/dist/types/lib/i18n/areas/code-editor.d.ts +40 -0
- package/dist/types/lib/i18n/areas/date-timeline.d.ts +36 -0
- package/dist/types/lib/i18n/areas/dates.d.ts +103 -0
- package/dist/types/lib/i18n/areas/docs-views.d.ts +297 -0
- package/dist/types/lib/i18n/areas/feedback.d.ts +132 -0
- package/dist/types/lib/i18n/areas/formats.d.ts +30 -0
- package/dist/types/lib/i18n/areas/forms.d.ts +182 -0
- package/dist/types/lib/i18n/areas/keys.d.ts +15 -0
- package/dist/types/lib/i18n/areas/markdown.d.ts +150 -0
- package/dist/types/lib/i18n/areas/move-rejected.d.ts +16 -0
- package/dist/types/lib/i18n/areas/navigation.d.ts +185 -0
- package/dist/types/lib/i18n/areas/rbac.d.ts +635 -0
- package/dist/types/lib/i18n/emphasis.d.ts +3 -0
- package/dist/types/lib/i18n/index.d.ts +10 -0
- package/dist/types/lib/i18n/number-format.d.ts +5 -0
- package/dist/types/lib/i18n/plural.d.ts +7 -0
- package/dist/types/lib/i18n/provider.d.ts +16 -0
- package/dist/types/lib/i18n/strings.d.ts +18 -0
- package/dist/types/lib/icons.d.ts +22 -0
- package/dist/types/lib/interactive-target.d.ts +3 -0
- package/dist/types/lib/intl-cache.d.ts +31 -0
- package/dist/types/lib/legal-document.d.ts +82 -0
- package/dist/types/lib/line-diff-model.d.ts +39 -0
- package/dist/types/lib/markdown/attachments.d.ts +50 -0
- package/dist/types/lib/markdown/caret-map.d.ts +69 -0
- package/dist/types/lib/markdown/caret.d.ts +6 -0
- package/dist/types/lib/markdown/commands.d.ts +186 -0
- package/dist/types/lib/markdown/convert.d.ts +99 -0
- package/dist/types/lib/markdown/dom.d.ts +30 -0
- package/dist/types/lib/markdown/edit.d.ts +16 -0
- package/dist/types/lib/markdown/history.d.ts +59 -0
- package/dist/types/lib/markdown/hotkeys.d.ts +63 -0
- package/dist/types/lib/markdown/image-pipeline.d.ts +173 -0
- package/dist/types/lib/markdown/images.d.ts +138 -0
- package/dist/types/lib/markdown/input.d.ts +38 -0
- package/dist/types/lib/markdown/keys.d.ts +34 -0
- package/dist/types/lib/markdown/paste.d.ts +9 -0
- package/dist/types/lib/markdown/position.d.ts +43 -0
- package/dist/types/lib/markdown/project.d.ts +88 -0
- package/dist/types/lib/markdown/reconcile.d.ts +63 -0
- package/dist/types/lib/markdown/surface.d.ts +236 -0
- package/dist/types/lib/motion.d.ts +30 -0
- package/dist/types/lib/pad.d.ts +6 -0
- package/dist/types/lib/paged-window/index.d.ts +2 -0
- package/dist/types/lib/paged-window/layout.d.ts +21 -0
- package/dist/types/lib/paged-window/list-owner.d.ts +12 -0
- package/dist/types/lib/paged-window/records-binding.d.ts +102 -0
- package/dist/types/lib/paged-window/store.d.ts +307 -0
- package/dist/types/lib/paged-window/use-measured-pitch.d.ts +34 -0
- package/dist/types/lib/paged-window/use-page-visibility.d.ts +20 -0
- package/dist/types/lib/paged-window/use-paged-window.d.ts +61 -0
- package/dist/types/lib/paged-window/use-scroll-root.d.ts +18 -0
- package/dist/types/lib/persist.d.ts +57 -0
- package/dist/types/lib/preference-values.d.ts +72 -0
- package/dist/types/lib/preferences.d.ts +26 -0
- package/dist/types/lib/reads/hooks.d.ts +49 -0
- package/dist/types/lib/reads/index.d.ts +5 -0
- package/dist/types/lib/reads/optimistic.d.ts +119 -0
- package/dist/types/lib/reads/refetch.d.ts +83 -0
- package/dist/types/lib/reads/slots.d.ts +137 -0
- package/dist/types/lib/reads/types.d.ts +155 -0
- package/dist/types/lib/realtime/hooks.d.ts +38 -0
- package/dist/types/lib/realtime/index.d.ts +4 -0
- package/dist/types/lib/realtime/provider.d.ts +38 -0
- package/dist/types/lib/realtime/registry.d.ts +225 -0
- package/dist/types/lib/realtime/types.d.ts +242 -0
- package/dist/types/lib/records/define-record-type.d.ts +29 -0
- package/dist/types/lib/records/hooks.d.ts +46 -0
- package/dist/types/lib/records/index.d.ts +5 -0
- package/dist/types/lib/records/store.d.ts +289 -0
- package/dist/types/lib/records/types.d.ts +195 -0
- package/dist/types/lib/records/wire.d.ts +96 -0
- package/dist/types/lib/reduced-motion-help.d.ts +23 -0
- package/dist/types/lib/scroll-caret.d.ts +6 -0
- package/dist/types/lib/sim/createSimStore.d.ts +18 -0
- package/dist/types/lib/sim/index.d.ts +5 -0
- package/dist/types/lib/sim/latency.d.ts +10 -0
- package/dist/types/lib/sim/registry.d.ts +14 -0
- package/dist/types/lib/sim/settings.d.ts +11 -0
- package/dist/types/lib/sim/types.d.ts +3 -0
- package/dist/types/lib/submit-shortcut.d.ts +24 -0
- package/dist/types/lib/syntax/index.d.ts +16 -0
- package/dist/types/lib/syntax/languages/bash.d.ts +1 -0
- package/dist/types/lib/syntax/languages/css.d.ts +1 -0
- package/dist/types/lib/syntax/languages/html.d.ts +17 -0
- package/dist/types/lib/syntax/languages/index.d.ts +33 -0
- package/dist/types/lib/syntax/languages/javascript.d.ts +22 -0
- package/dist/types/lib/syntax/languages/json.d.ts +1 -0
- package/dist/types/lib/syntax/languages/mongodb.d.ts +1 -0
- package/dist/types/lib/syntax/languages/plain.d.ts +9 -0
- package/dist/types/lib/syntax/languages/sql.d.ts +4 -0
- package/dist/types/lib/syntax/languages/vue.d.ts +1 -0
- package/dist/types/lib/syntax/languages/yaml.d.ts +1 -0
- package/dist/types/lib/syntax/markdown/frames.d.ts +145 -0
- package/dist/types/lib/syntax/markdown/grammar.d.ts +1 -0
- package/dist/types/lib/syntax/markdown/index.d.ts +5 -0
- package/dist/types/lib/syntax/markdown/inline.d.ts +21 -0
- package/dist/types/lib/syntax/markdown/parse.d.ts +15 -0
- package/dist/types/lib/syntax/markdown/refs.d.ts +47 -0
- package/dist/types/lib/syntax/markdown/render.d.ts +25 -0
- package/dist/types/lib/syntax/markdown/spans.d.ts +84 -0
- package/dist/types/lib/syntax/markdown/types.d.ts +108 -0
- package/dist/types/lib/syntax/registry.d.ts +37 -0
- package/dist/types/lib/syntax/tokenize.d.ts +17 -0
- package/dist/types/lib/syntax/types.d.ts +119 -0
- package/dist/types/lib/time/index.d.ts +4 -0
- package/dist/types/lib/time/instant.d.ts +2 -0
- package/dist/types/lib/time/plain.d.ts +61 -0
- package/dist/types/lib/time/relativeAge.d.ts +18 -0
- package/dist/types/lib/time/relativeClock.d.ts +8 -0
- package/dist/types/lib/time/types.d.ts +87 -0
- package/dist/types/lib/time/zone.d.ts +106 -0
- package/dist/types/lib/use-controllable.d.ts +14 -0
- package/dist/types/lib/use-fill-height.d.ts +26 -0
- package/dist/types/lib/use-hydrated.d.ts +8 -0
- package/dist/types/lib/use-media-query.d.ts +29 -0
- package/dist/types/lib/use-relabel-base-ui-dismiss.d.ts +6 -0
- package/dist/types/lib/use-release-snap-drag.d.ts +25 -0
- package/dist/types/lib/use-roving-options.d.ts +10 -0
- package/dist/types/lib/values/absent.d.ts +7 -0
- package/dist/types/lib/values/boolean.d.ts +29 -0
- package/dist/types/lib/values/currency.d.ts +22 -0
- package/dist/types/lib/values/date.d.ts +30 -0
- package/dist/types/lib/values/datetime.d.ts +48 -0
- package/dist/types/lib/values/index.d.ts +5 -0
- package/dist/types/lib/values/locale-date.d.ts +34 -0
- package/dist/types/lib/values/number.d.ts +27 -0
- package/dist/types/pure.d.ts +48 -0
- package/package.json +136 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkeys.js","sources":["../../../src/lib/markdown/hotkeys.ts"],"sourcesContent":["/* ============================================================================\n THE HOTKEY TABLE — data, not code.\n\n Ported from danx-ui's `hotkeyDefinitions`, which is the point: it is the\n accumulated result of somebody using their editor, and re-deriving a keymap\n from first principles would throw that away to arrive somewhere worse. What\n changed is the OTHER side of each row — every action is now a pure command\n over the source string rather than a call into a DOM-mutating composable, so\n the whole table is testable without a browser.\n\n TWO ROWS ARE MISSING, deliberately: highlight and underline. Neither is\n CommonMark or GFM, and this parser is strict about that (see ./commands.ts\n for the argument). A key that writes characters the renderer shows as literal\n text is worse than a key that does nothing.\n\n HELP IS PART OF THE CONTRACT, not a nicety. WCAG 2.1.2's advisement clause is\n normative: an editor may own Tab, but an UNDOCUMENTED escape is a failure\n even when the escape exists. `id` (whose description the provider holds) and\n `group` are what the help surface renders, so a key that cannot be described\n cannot be added.\n ========================================================================= */\n\nimport {\n adjustHeading,\n alignColumn,\n deleteColumn,\n deleteRow,\n deleteTable,\n insertLink,\n insertRow,\n insertRule,\n setHeading,\n smartShiftTab,\n smartTab,\n toggleBold,\n toggleCode,\n toggleCodeBlock,\n toggleItalic,\n toggleList,\n toggleQuote,\n toggleStrike,\n toggleTask,\n type Command,\n} from \"./commands\";\n\nexport type HotkeyGroup = \"formatting\" | \"headings\" | \"lists\" | \"blocks\" | \"tables\";\n\n/**\n * What a row does, in the words of no language: the help surface looks the row's\n * description up under this id in the active `UiLocaleProvider`'s strings\n * (`markdownEditor.hotkeys`), so the table holds chords and commands only.\n */\nexport type HotkeyId =\n | \"bold\" | \"italic\" | \"inlineCode\" | \"strikethrough\" | \"link\" | \"attachFile\"\n | \"paragraph\" | \"heading1\" | \"heading2\" | \"heading3\" | \"heading4\" | \"heading5\" | \"heading6\"\n | \"decreaseHeading\" | \"increaseHeading\"\n | \"bulletList\" | \"numberedList\" | \"taskCheckbox\" | \"indent\" | \"outdent\"\n | \"codeBlock\" | \"blockquote\" | \"horizontalRule\"\n | \"table\" | \"rowAbove\" | \"rowBelow\" | \"columnLeft\" | \"columnRight\" | \"deleteRow\" | \"deleteColumn\" | \"deleteTable\"\n | \"alignLeft\" | \"alignCenter\" | \"alignRight\";\n\n/**\n * Something only the editor itself can do, because it is not a function of the\n * source (DX-3134).\n *\n * Attaching a file means choosing it first, which needs a file picker —\n * a browser dialog, not a splice. The row that used to insert an empty `![]()`\n * (a construct with nothing to show, which rendered as nothing) now asks the\n * editor for the picker instead, and the chosen files go through the same\n * pipeline as a paste or a drop.\n */\nexport type EditorRequest = \"pickFiles\" | \"insertTable\" | \"insertColumnLeft\" | \"insertColumnRight\";\n\ninterface HotkeyBase {\n id: HotkeyId;\n /**\n * The chord this matches: lower-case, modifiers first, in the order ctrl,\n * alt, shift.\n *\n * PUNCTUATION IS SPELLED BY PHYSICAL KEY (`bracketleft`, `comma`), not by the\n * character it produces. The browser probe found why: with Shift held, the\n * `[` key reports `event.key === \"{\"`, so a table keyed on `[` never matched\n * and Ctrl+Shift+[ was silently inert. `event.code` is the same regardless of\n * which character the modifier produced.\n */\n key: string;\n group: HotkeyGroup;\n}\n\n/** A chord, and EITHER the pure edit it makes OR the editor request it raises. */\ntype HotkeyAction = { command: Command; request?: never } | { request: EditorRequest; command?: never };\nexport type Hotkey = HotkeyBase & HotkeyAction;\n\nexport const HOTKEYS: readonly Hotkey[] = [\n /* Inline formatting */\n { id: \"bold\", key: \"ctrl+b\", group: \"formatting\", command: toggleBold },\n { id: \"italic\", key: \"ctrl+i\", group: \"formatting\", command: toggleItalic },\n { id: \"inlineCode\", key: \"ctrl+e\", group: \"formatting\", command: toggleCode },\n { id: \"strikethrough\", key: \"ctrl+shift+s\", group: \"formatting\", command: toggleStrike },\n { id: \"link\", key: \"ctrl+k\", group: \"formatting\", command: insertLink() },\n { id: \"attachFile\", key: \"ctrl+shift+i\", group: \"formatting\", request: \"pickFiles\" },\n\n /* Headings */\n { id: \"paragraph\", key: \"ctrl+0\", group: \"headings\", command: setHeading(0) },\n { id: \"heading1\", key: \"ctrl+1\", group: \"headings\", command: setHeading(1) },\n { id: \"heading2\", key: \"ctrl+2\", group: \"headings\", command: setHeading(2) },\n { id: \"heading3\", key: \"ctrl+3\", group: \"headings\", command: setHeading(3) },\n { id: \"heading4\", key: \"ctrl+4\", group: \"headings\", command: setHeading(4) },\n { id: \"heading5\", key: \"ctrl+5\", group: \"headings\", command: setHeading(5) },\n { id: \"heading6\", key: \"ctrl+6\", group: \"headings\", command: setHeading(6) },\n { id: \"decreaseHeading\", key: \"ctrl+shift+comma\", group: \"headings\", command: adjustHeading(-1) },\n { id: \"increaseHeading\", key: \"ctrl+shift+period\", group: \"headings\", command: adjustHeading(1) },\n\n /* Lists */\n { id: \"bulletList\", key: \"ctrl+shift+bracketleft\", group: \"lists\", command: toggleList(false) },\n { id: \"numberedList\", key: \"ctrl+shift+bracketright\", group: \"lists\", command: toggleList(true) },\n { id: \"taskCheckbox\", key: \"ctrl+shift+x\", group: \"lists\", command: toggleTask },\n // I18N-ALLOW: the chord string \"tab\" is a key id matched against the registry and never rendered (chordLabel names it from the catalog); the scan reads the lone word as English\n { id: \"indent\", key: \"tab\", group: \"lists\", command: smartTab },\n { id: \"outdent\", key: \"shift+tab\", group: \"lists\", command: smartShiftTab },\n\n /* Blocks */\n { id: \"codeBlock\", key: \"ctrl+shift+k\", group: \"blocks\", command: toggleCodeBlock() },\n { id: \"blockquote\", key: \"ctrl+shift+q\", group: \"blocks\", command: toggleQuote },\n { id: \"horizontalRule\", key: \"ctrl+shift+enter\", group: \"blocks\", command: insertRule },\n\n /* Tables */\n { id: \"table\", key: \"ctrl+alt+shift+t\", group: \"tables\", request: \"insertTable\" },\n { id: \"rowAbove\", key: \"ctrl+alt+shift+arrowup\", group: \"tables\", command: insertRow(false) },\n { id: \"rowBelow\", key: \"ctrl+alt+shift+arrowdown\", group: \"tables\", command: insertRow(true) },\n { id: \"columnLeft\", key: \"ctrl+alt+shift+arrowleft\", group: \"tables\", request: \"insertColumnLeft\" },\n { id: \"columnRight\", key: \"ctrl+alt+shift+arrowright\", group: \"tables\", request: \"insertColumnRight\" },\n { id: \"deleteRow\", key: \"ctrl+alt+backspace\", group: \"tables\", command: deleteRow },\n { id: \"deleteColumn\", key: \"ctrl+shift+backspace\", group: \"tables\", command: deleteColumn },\n { id: \"deleteTable\", key: \"ctrl+alt+shift+backspace\", group: \"tables\", command: deleteTable },\n { id: \"alignLeft\", key: \"ctrl+alt+l\", group: \"tables\", command: alignColumn(\"left\") },\n { id: \"alignCenter\", key: \"ctrl+alt+c\", group: \"tables\", command: alignColumn(\"center\") },\n { id: \"alignRight\", key: \"ctrl+alt+r\", group: \"tables\", command: alignColumn(\"right\") },\n];\n\n/**\n * The chords a key event could be, most specific first.\n *\n * TWO SPELLINGS, because neither alone is enough. The CHARACTER spelling is\n * what a letter or digit chord needs — Ctrl+B is the letter B whatever key\n * produced it. The PHYSICAL spelling is what punctuation needs: with Shift\n * held, the `[` key reports `event.key === \"{\"`, so a table keyed on the\n * character never matches and the chord is silently inert. The browser probe\n * found exactly that: Ctrl+Shift+[ did nothing at all, and nothing in the unit\n * suite could have seen it, because the commands themselves were correct.\n *\n * Modifiers in a FIXED order, because `ctrl+shift+s` and `shift+ctrl+s` are the\n * same chord and a table keyed on free-form strings silently misses one of\n * them. `metaKey` folds into `ctrl` so one table serves macOS, where the\n * platform convention is Command for every one of these.\n */\nexport function chordsOf(event: KeyboardEvent): string[] {\n const parts: string[] = [];\n // I18N-ALLOW: modifier id of a hotkey chord, matched against the registry\n if (event.ctrlKey || event.metaKey) parts.push(\"ctrl\");\n // I18N-ALLOW: modifier id of a hotkey chord, matched against the registry\n if (event.altKey) parts.push(\"alt\");\n // I18N-ALLOW: modifier id of a hotkey chord, matched against the registry\n if (event.shiftKey) parts.push(\"shift\");\n const prefix = parts.length ? parts.join(\"+\") + \"+\" : \"\";\n const chords = [prefix + event.key.toLowerCase()];\n if (event.code) chords.push(prefix + event.code.toLowerCase());\n return chords;\n}\n\nconst BY_CHORD = new Map(HOTKEYS.map((hotkey) => [hotkey.key, hotkey]));\n\nexport function hotkeyFor(event: KeyboardEvent): Hotkey | null {\n for (const chord of chordsOf(event)) {\n const found = BY_CHORD.get(chord);\n if (found) return found;\n }\n return null;\n}\n"],"names":["HOTKEYS","toggleBold","toggleItalic","toggleCode","toggleStrike","insertLink","setHeading","adjustHeading","toggleList","toggleTask","smartTab","smartShiftTab","toggleCodeBlock","toggleQuote","insertRule","insertRow","deleteRow","deleteColumn","deleteTable","alignColumn","chordsOf","event","parts","prefix","chords","BY_CHORD","hotkey","hotkeyFor","chord","found"],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { nearestStop as y } from "./caret-map.js";
|
|
2
|
+
import { nextReferenceNumber as k } from "./attachments.js";
|
|
3
|
+
import { referenceMarkdown as U, enclosingCode as E, findUnstoredImages as L, markdownDestination as R, reshapeForCodeBoundary as S, isUnstoredImageSrc as M, sanitizeImageSrc as F } from "./images.js";
|
|
4
|
+
import { sanitizeHref as P } from "../syntax/markdown/render.js";
|
|
5
|
+
const b = 300;
|
|
6
|
+
function j(c) {
|
|
7
|
+
const t = (c instanceof Error ? c.message : void 0)?.trim();
|
|
8
|
+
if (t)
|
|
9
|
+
return t.length > b ? `${t.slice(0, b - 1)}…` : t;
|
|
10
|
+
}
|
|
11
|
+
const I = {
|
|
12
|
+
createObjectURL: (c) => URL.createObjectURL(c),
|
|
13
|
+
revokeObjectURL: (c) => URL.revokeObjectURL(c),
|
|
14
|
+
preload: (c) => {
|
|
15
|
+
const e = new Image();
|
|
16
|
+
return e.src = c, e.decode();
|
|
17
|
+
},
|
|
18
|
+
preloadTimeoutMs: 1e4
|
|
19
|
+
};
|
|
20
|
+
class A {
|
|
21
|
+
constructor(e) {
|
|
22
|
+
this.options = e, this.env = { ...I, ...e.environment };
|
|
23
|
+
}
|
|
24
|
+
options;
|
|
25
|
+
surface = null;
|
|
26
|
+
entries = /* @__PURE__ */ new Map();
|
|
27
|
+
/** Where each stored URL came from: the object URL that held its place in the document until its upload finished. */
|
|
28
|
+
origins = /* @__PURE__ */ new Map();
|
|
29
|
+
env;
|
|
30
|
+
last = null;
|
|
31
|
+
revision = 0;
|
|
32
|
+
disposed = !1;
|
|
33
|
+
/**
|
|
34
|
+
* What the strip knows about an object URL this editor minted, or null for
|
|
35
|
+
* anything else. An arrow property so it can be handed around before the
|
|
36
|
+
* surface exists.
|
|
37
|
+
*/
|
|
38
|
+
resolve = (e) => {
|
|
39
|
+
const t = this.entries.get(e.trim());
|
|
40
|
+
return t ? { file: t.file, state: t.state, message: t.message } : null;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* A name for a file that does not change when its upload finishes: the object URL it was first written under,
|
|
44
|
+
* or the URL itself for a file that was never swapped. A tile keyed or opened on it survives the swap.
|
|
45
|
+
*/
|
|
46
|
+
identity = (e) => {
|
|
47
|
+
const t = e.trim();
|
|
48
|
+
return this.origins.get(t) ?? t;
|
|
49
|
+
};
|
|
50
|
+
/** Whether a file of this MIME type is a picture `uploadImage` stores. */
|
|
51
|
+
isPicture(e) {
|
|
52
|
+
if (!e.startsWith("image/")) return !1;
|
|
53
|
+
const t = this.options.imageTypes();
|
|
54
|
+
return t === void 0 || t.includes(e);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Whether the editor takes a file of this MIME type: a picture it stores, or any file once `uploadFile` is set.
|
|
58
|
+
* Read by paste, drop and the picker, so all three agree.
|
|
59
|
+
*/
|
|
60
|
+
accepts = (e) => this.isPicture(e) || this.options.uploadFile() !== null;
|
|
61
|
+
/** Connects the surface this pipeline edits, and reports the first snapshot. */
|
|
62
|
+
attach(e) {
|
|
63
|
+
this.surface = e, this.sync();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* THE pipeline: every file that enters the editor comes through here -
|
|
67
|
+
* paste, drop and the file picker alike.
|
|
68
|
+
*
|
|
69
|
+
* `at` is where the references go: the caret for a paste or a pick, the drop
|
|
70
|
+
* point for a drop. With none (an editor that was never focused), they go at
|
|
71
|
+
* the end of the document - never at offset 0 in front of whatever the
|
|
72
|
+
* author wrote first. A file the editor does not take (`accepts`) is ignored;
|
|
73
|
+
* the picker's `accept` is a hint the user can override, not a guarantee.
|
|
74
|
+
*
|
|
75
|
+
* Returns the object URLs it inserted, in order.
|
|
76
|
+
*/
|
|
77
|
+
insert(e, t) {
|
|
78
|
+
const r = this.requireSurface(), s = e.filter((l) => this.accepts(l.type));
|
|
79
|
+
if (!s.length) return [];
|
|
80
|
+
const i = s.map((l) => {
|
|
81
|
+
const o = this.isPicture(l.type), p = this.env.createObjectURL(l), v = o ? this.options.uploadImage() : this.options.uploadFile();
|
|
82
|
+
return this.entries.set(p, { file: l, picture: o, state: v ? "uploading" : "local", controller: null }), p;
|
|
83
|
+
}), a = r.getSource(), u = k(a, { isFileUrl: this.options.isFileUrl() });
|
|
84
|
+
let n = "";
|
|
85
|
+
s.forEach((l, o) => {
|
|
86
|
+
const p = `${this.options.kindWord(l)} ${u + o}`, v = this.entries.get(i[o]).picture ? "image" : "link";
|
|
87
|
+
n += (n ? " " : "") + U(v, i[o], p);
|
|
88
|
+
});
|
|
89
|
+
const f = t ?? r.getSelection() ?? { anchor: a.length, head: a.length }, g = r.getCaretMap();
|
|
90
|
+
let d = y(g, Math.min(f.anchor, f.head)), m = y(g, Math.max(f.anchor, f.head));
|
|
91
|
+
const h = E(r.getProjection(), d);
|
|
92
|
+
if (h && (d = m = y(g, h.end), h.block && (n = S(a, d, n))), !h?.block) {
|
|
93
|
+
const l = r.getProjection().frames.filter((o) => o.frame.kind === "image" || o.frame.kind === "link");
|
|
94
|
+
l.some((o) => o.end === d) ? n = ` ${n}` : !h && d > 0 && !/[\s(\[{]/.test(a[d - 1]) && (n = ` ${n}`), l.some((o) => o.start === m) && (n = `${n} `);
|
|
95
|
+
}
|
|
96
|
+
const w = d + n.length;
|
|
97
|
+
r.breakUndoGroup(), r.apply({ start: d, end: m, text: n }, { anchor: w, head: w }, "other"), r.breakUndoGroup();
|
|
98
|
+
for (const l of i) {
|
|
99
|
+
const o = this.uploaderFor(this.entries.get(l));
|
|
100
|
+
o && this.upload(l, o);
|
|
101
|
+
}
|
|
102
|
+
return this.sync(), i;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Uploads a failed file again, with the SAME File it was inserted with.
|
|
106
|
+
*
|
|
107
|
+
* With no uploader configured any more, the file becomes local-only rather
|
|
108
|
+
* than staying "failed" - the honest state for something nothing can store.
|
|
109
|
+
*/
|
|
110
|
+
retry(e) {
|
|
111
|
+
const t = e.trim(), r = this.entries.get(t);
|
|
112
|
+
if (!r || r.state !== "failed") return;
|
|
113
|
+
const s = this.uploaderFor(r);
|
|
114
|
+
s ? this.upload(t, s) : (r.state = "local", r.message = void 0), this.changed();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Starts uploading every local-only file once an uploader exists.
|
|
118
|
+
*
|
|
119
|
+
* The component calls this when an uploader changes: a file pasted before an
|
|
120
|
+
* app's storage provider mounted should not stay unsaveable when the storage
|
|
121
|
+
* it needed arrives a moment later.
|
|
122
|
+
*/
|
|
123
|
+
uploaderChanged() {
|
|
124
|
+
const e = this.requireSurface().getSource();
|
|
125
|
+
let t = !1;
|
|
126
|
+
for (const [r, s] of this.entries) {
|
|
127
|
+
if (s.state !== "local" || !e.includes(r)) continue;
|
|
128
|
+
const i = this.uploaderFor(s);
|
|
129
|
+
i && (this.upload(r, i), t = !0);
|
|
130
|
+
}
|
|
131
|
+
t && this.changed();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Recomputes the snapshot from the CURRENT document, and releases object
|
|
135
|
+
* URLs nothing can reach any more. Called after every change to the source.
|
|
136
|
+
*
|
|
137
|
+
* THE COUNTS COME FROM `findUnstoredImages`, the same exported function a
|
|
138
|
+
* consumer's save path calls - one detection source, never a second opinion
|
|
139
|
+
* the two could disagree on (DX-3134).
|
|
140
|
+
*
|
|
141
|
+
* AN OBJECT URL IS RELEASED WHEN ITS FILE IS GONE AND SETTLED: not in the
|
|
142
|
+
* document, not in any undo or redo entry (Ctrl+Z could bring it back), and
|
|
143
|
+
* not mid-upload (the upload will swap it wherever it still is). Revoking one
|
|
144
|
+
* any earlier turns an undo into a broken file; never revoking leaks the
|
|
145
|
+
* file's bytes for the life of the page.
|
|
146
|
+
*/
|
|
147
|
+
sync() {
|
|
148
|
+
const e = this.surface;
|
|
149
|
+
if (!e || this.disposed) return;
|
|
150
|
+
const t = e.getSource();
|
|
151
|
+
for (const [a, u] of this.entries)
|
|
152
|
+
u.controller || t.includes(a) || e.remembers(a) || this.release(a);
|
|
153
|
+
const r = L(t), s = {
|
|
154
|
+
uploading: 0,
|
|
155
|
+
failed: 0,
|
|
156
|
+
unstored: r.length,
|
|
157
|
+
local: 0,
|
|
158
|
+
revision: this.revision
|
|
159
|
+
};
|
|
160
|
+
for (const a of r) {
|
|
161
|
+
const n = this.entries.get(a.src.trim())?.state ?? "foreign";
|
|
162
|
+
n === "uploading" ? s.uploading++ : n === "local" ? s.local++ : s.failed++;
|
|
163
|
+
}
|
|
164
|
+
const i = this.last;
|
|
165
|
+
i && i.uploading === s.uploading && i.failed === s.failed && i.unstored === s.unstored && i.local === s.local && i.revision === s.revision || (this.last = s, this.options.onChange(s));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Stops everything: aborts every upload in flight and releases every object
|
|
169
|
+
* URL. The editor is going away, so nothing it minted can be drawn anywhere
|
|
170
|
+
* again - no other editor will render another's `blob:`.
|
|
171
|
+
*/
|
|
172
|
+
dispose() {
|
|
173
|
+
this.disposed = !0, this.origins.clear();
|
|
174
|
+
for (const e of [...this.entries.keys()]) this.release(e);
|
|
175
|
+
this.surface = null;
|
|
176
|
+
}
|
|
177
|
+
/* --- Internals ---------------------------------------------------------- */
|
|
178
|
+
uploaderFor(e) {
|
|
179
|
+
return e.picture ? this.options.uploadImage() : this.options.uploadFile();
|
|
180
|
+
}
|
|
181
|
+
async upload(e, t) {
|
|
182
|
+
const r = this.entries.get(e);
|
|
183
|
+
if (!r) return;
|
|
184
|
+
const s = new AbortController();
|
|
185
|
+
r.state = "uploading", r.controller = s, r.message = void 0;
|
|
186
|
+
let i;
|
|
187
|
+
try {
|
|
188
|
+
const u = await t(r.file, { signal: s.signal });
|
|
189
|
+
i = O(u, r.picture);
|
|
190
|
+
} catch (u) {
|
|
191
|
+
if (s.signal.aborted) return;
|
|
192
|
+
r.state = "failed", r.controller = null, r.message = j(u), console.error(`[MarkdownEditor] upload failed for "${r.file.name}":`, u), this.changed();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (r.picture && await this.settled(this.env.preload(i), s.signal), s.signal.aborted || !this.surface) return;
|
|
196
|
+
r.controller = null;
|
|
197
|
+
const a = R(i);
|
|
198
|
+
this.surface.substitute(e, a), this.origins.set(a, e), this.sync();
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Resolves when `work` settles, `preloadTimeoutMs` passes, or `signal`
|
|
202
|
+
* aborts - never rejects. Every timer and listener is cleaned up.
|
|
203
|
+
*/
|
|
204
|
+
settled(e, t) {
|
|
205
|
+
return new Promise((r) => {
|
|
206
|
+
const s = () => {
|
|
207
|
+
clearTimeout(i), t.removeEventListener("abort", s), r();
|
|
208
|
+
}, i = setTimeout(s, this.env.preloadTimeoutMs);
|
|
209
|
+
t.addEventListener("abort", s), e.then(s, s);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
release(e) {
|
|
213
|
+
const t = this.entries.get(e);
|
|
214
|
+
t && (t.controller?.abort(), this.entries.delete(e), this.env.revokeObjectURL(e));
|
|
215
|
+
}
|
|
216
|
+
/** A file's state moved: re-report, so its tile redraws. */
|
|
217
|
+
changed() {
|
|
218
|
+
!this.surface || this.disposed || (this.revision++, this.sync());
|
|
219
|
+
}
|
|
220
|
+
requireSurface() {
|
|
221
|
+
if (!this.surface) throw new Error("ImagePipeline: attach(surface) before using it");
|
|
222
|
+
return this.surface;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function O(c, e) {
|
|
226
|
+
const t = c?.url;
|
|
227
|
+
if (typeof t != "string" || !t.trim())
|
|
228
|
+
throw new Error("the uploader resolved without a `url` string");
|
|
229
|
+
if (M(t) || !(e ? F(t) : P(t)))
|
|
230
|
+
throw new Error(`the uploader resolved with a URL a stored file cannot have: ${t.slice(0, 80)}`);
|
|
231
|
+
return t.trim();
|
|
232
|
+
}
|
|
233
|
+
export {
|
|
234
|
+
A as ImagePipeline
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=image-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-pipeline.js","sources":["../../../src/lib/markdown/image-pipeline.ts"],"sourcesContent":["/* ============================================================================\n THE FILE PIPELINE - one path from a File to a stored, named reference in the document.\n\n DX-3134, DXUI-74. Three gestures put a file into the editor: pasting one,\n dropping one, and choosing one with the toolbar's Attach file button (or its\n chord). They all end here, in `insert`, and nowhere else - PLN-10 R-2's \"one\n pipeline, no parallel paths\" is the reason there is one method and not three\n that agree.\n\n WHAT `insert` DOES, in order:\n 1. mints an object URL for each file, so the reference exists NOW, before a\n single byte has left the machine;\n 2. writes `` (a picture) or `[PDF 2](blob:...)` (any\n other file) at the caret (or the drop point) as ONE ordinary edit -\n undoable, like typing it would be;\n 3. hands each file to the consumer's uploader, and on success swaps the\n object URL for the stored one through `MarkdownSurface.substitute`,\n which rewrites the document AND its undo history, so no later undo can\n bring back a URL that no longer means anything.\n\n THE REGISTRY is the set of object URLs this editor minted, with the File\n each came from. It is what the attachment strip reads for a tile's picture\n and state, and what makes Retry possible: the original File is kept until\n the file is stored, or gone and settled.\n\n NO REACT HERE, like the rest of this directory. The component supplies the\n uploaders and listens for state; everything that decides anything is plain\n code that a test can drive with a fake uploader and a fake URL factory.\n ========================================================================= */\n\nimport { nearestStop } from \"./caret-map\";\nimport { nextReferenceNumber } from \"./attachments\";\nimport {\n enclosingCode,\n findUnstoredImages,\n isUnstoredImageSrc,\n markdownDestination,\n referenceMarkdown,\n reshapeForCodeBoundary,\n sanitizeImageSrc,\n} from \"./images\";\nimport { sanitizeHref } from \"../syntax/markdown/render\";\nimport type { SourceSelection } from \"./position\";\nimport type { MarkdownSurface } from \"./surface\";\n\n/**\n * Stores one file and says where it now lives. The same contract serves a picture (`uploadImage`) and any\n * other file (`uploadFile`).\n *\n * `signal` aborts when the editor unmounts; an uploader that ignores it still\n * works, its result is simply discarded. The returned `url` must be one an\n * `<img>` may load (`http(s)`, a relative URL, or `data:image/*` -\n * `sanitizeImageSrc`) and never another `blob:`; anything else is reported\n * as a failed upload rather than written into the document.\n */\nexport type ImageUploader = (file: File, options: { signal: AbortSignal }) => Promise<{ url: string }>;\n\n/**\n * What the consumer needs to decide whether it may save (PLN-10 R-1).\n *\n * Counts REFERENCES IN THE CURRENT DOCUMENT to a file not stored yet, one per construct - the same unit\n * `findUnstoredImages` returns, so `unstored === findUnstoredImages(value).length`\n * always. `uploading` are being stored, `failed` cannot be stored without the\n * author acting (a rejected upload, or a `blob:` this editor did not mint), and\n * `unstored` is every file not stored yet - `uploading + failed` plus those\n * with no storage configured. `unstored > 0` means the value must not be saved.\n */\nexport interface ImageUploadState {\n uploading: number;\n failed: number;\n unstored: number;\n}\n\n/** The editor's own view: the public counts, plus what its chrome needs. */\nexport interface ImagePipelineSnapshot extends ImageUploadState {\n /** Files that cannot be stored because there is no uploader. */\n local: number;\n /** Bumps whenever a file's state moves, so a tile redraws even when the counts above do not change. */\n revision: number;\n}\n\n/** What the pipeline knows about one object URL it minted: the strip's source for a tile's picture and state. */\nexport interface LocalFileInfo {\n file: File;\n state: \"uploading\" | \"failed\" | \"local\";\n /** The rejection's own text, present only when `state === \"failed\"` and the uploader threw an `Error`. */\n message?: string;\n}\n\n/**\n * The longest an uploader's rejection message is kept, in characters.\n *\n * A message this long has already said what it needs to; anything past this\n * is defensive against an uploader that throws its whole response body (a\n * stack trace, an HTML error page) rather than a short reason, which would\n * otherwise blow out the tile's detail line.\n */\nconst MAX_UPLOAD_ERROR_MESSAGE_LENGTH = 300;\n\n/**\n * The rejection's own text, trimmed and length-capped - or undefined when the\n * uploader threw something with no usable message (not an `Error`, or an\n * `Error` with empty/whitespace-only `.message`). Never throws.\n */\nfunction errorMessage(error: unknown): string | undefined {\n const raw = error instanceof Error ? error.message : undefined;\n const trimmed = raw?.trim();\n if (!trimmed) return undefined;\n return trimmed.length > MAX_UPLOAD_ERROR_MESSAGE_LENGTH\n ? `${trimmed.slice(0, MAX_UPLOAD_ERROR_MESSAGE_LENGTH - 1)}…`\n : trimmed;\n}\n\n/**\n * The browser facilities the pipeline touches, injectable so a test never\n * needs a real object URL or a real network.\n */\nexport interface ImagePipelineEnvironment {\n createObjectURL: (file: File) => string;\n revokeObjectURL: (url: string) => void;\n /**\n * Settles once `url` has loaded or failed to. The swap waits for it so the\n * stored picture is already in the cache when it replaces the local one -\n * otherwise the tile blinks empty for as long as the download takes.\n */\n preload: (url: string) => Promise<unknown>;\n /**\n * The longest the swap waits for `preload`. A stored URL whose download\n * stalls would otherwise hold a file that IS stored in \"uploading\" for\n * ever - save disabled, page-leave guarded - for want of a cache warm-up.\n */\n preloadTimeoutMs: number;\n}\n\nexport interface ImagePipelineOptions {\n /** The picture uploader in force right now, or null when there is no storage for pictures. */\n uploadImage: () => ImageUploader | null;\n /** The uploader for any other file, or null: then a file that is not a picture is ignored. */\n uploadFile: () => ImageUploader | null;\n /** The picture types `uploadImage` stores, or undefined for every `image/*`. A picture outside them goes to `uploadFile` as a link. */\n imageTypes: () => readonly string[] | undefined;\n /** Whether a link's destination is a file the app stores or a file this editor minted; numbering counts only those. */\n isFileUrl: () => (url: string) => boolean;\n /** The word a file's reference name starts with (\"Image\", \"PDF\"), from the library's strings. */\n kindWord: (file: File) => string;\n /** Called whenever the snapshot changes, and once when attached. */\n onChange: (snapshot: ImagePipelineSnapshot) => void;\n environment?: Partial<ImagePipelineEnvironment>;\n}\n\ninterface Entry {\n file: File;\n /** A picture is written as an image construct and stored by `uploadImage`; any other file as a link by `uploadFile`. */\n picture: boolean;\n state: LocalFileInfo[\"state\"];\n /** The in-flight upload's controller; null whenever nothing is in flight. */\n controller: AbortController | null;\n /** Set on a rejection (DX-3146); stale once a fresh attempt starts. */\n message?: string;\n}\n\nconst browserEnvironment: ImagePipelineEnvironment = {\n createObjectURL: (file) => URL.createObjectURL(file),\n revokeObjectURL: (url) => URL.revokeObjectURL(url),\n preload: (url) => {\n const image = new Image();\n image.src = url;\n return image.decode();\n },\n preloadTimeoutMs: 10_000,\n};\n\nexport class ImagePipeline {\n private surface: MarkdownSurface | null = null;\n private readonly entries = new Map<string, Entry>();\n /** Where each stored URL came from: the object URL that held its place in the document until its upload finished. */\n private readonly origins = new Map<string, string>();\n private readonly env: ImagePipelineEnvironment;\n private last: ImagePipelineSnapshot | null = null;\n private revision = 0;\n private disposed = false;\n\n constructor(private readonly options: ImagePipelineOptions) {\n this.env = { ...browserEnvironment, ...options.environment };\n }\n\n /**\n * What the strip knows about an object URL this editor minted, or null for\n * anything else. An arrow property so it can be handed around before the\n * surface exists.\n */\n readonly resolve = (src: string): LocalFileInfo | null => {\n const entry = this.entries.get(src.trim());\n return entry ? { file: entry.file, state: entry.state, message: entry.message } : null;\n };\n\n /**\n * A name for a file that does not change when its upload finishes: the object URL it was first written under,\n * or the URL itself for a file that was never swapped. A tile keyed or opened on it survives the swap.\n */\n readonly identity = (src: string): string => {\n const url = src.trim();\n return this.origins.get(url) ?? url;\n };\n\n /** Whether a file of this MIME type is a picture `uploadImage` stores. */\n private isPicture(mimeType: string): boolean {\n if (!mimeType.startsWith(\"image/\")) return false;\n const types = this.options.imageTypes();\n return types === undefined || types.includes(mimeType);\n }\n\n /**\n * Whether the editor takes a file of this MIME type: a picture it stores, or any file once `uploadFile` is set.\n * Read by paste, drop and the picker, so all three agree.\n */\n readonly accepts = (mimeType: string): boolean => this.isPicture(mimeType) || this.options.uploadFile() !== null;\n\n /** Connects the surface this pipeline edits, and reports the first snapshot. */\n attach(surface: MarkdownSurface): void {\n this.surface = surface;\n this.sync();\n }\n\n /**\n * THE pipeline: every file that enters the editor comes through here -\n * paste, drop and the file picker alike.\n *\n * `at` is where the references go: the caret for a paste or a pick, the drop\n * point for a drop. With none (an editor that was never focused), they go at\n * the end of the document - never at offset 0 in front of whatever the\n * author wrote first. A file the editor does not take (`accepts`) is ignored;\n * the picker's `accept` is a hint the user can override, not a guarantee.\n *\n * Returns the object URLs it inserted, in order.\n */\n insert(files: readonly File[], at: SourceSelection | null): string[] {\n const surface = this.requireSurface();\n const taken = files.filter((file) => this.accepts(file.type));\n if (!taken.length) return [];\n\n /* Registered BEFORE the edit, so the very first render of the new\n construct already finds it in the registry. */\n const urls = taken.map((file) => {\n const picture = this.isPicture(file.type);\n const url = this.env.createObjectURL(file);\n const uploader = picture ? this.options.uploadImage() : this.options.uploadFile();\n this.entries.set(url, { file, picture, state: uploader ? \"uploading\" : \"local\", controller: null });\n return url;\n });\n\n /* A SPACE BETWEEN SEVERAL REFERENCES, never a newline: this may be a table\n cell or a heading, where a newline would end the construct the author\n is standing in. Each file takes the next number after the document's own,\n counted once: a batch landing in a place the document does not read as a\n reference (an unclosed fence) would otherwise number every file alike. */\n const source = surface.getSource();\n const first = nextReferenceNumber(source, { isFileUrl: this.options.isFileUrl() });\n let text = \"\";\n taken.forEach((file, i) => {\n const name = `${this.options.kindWord(file)} ${first + i}`;\n const kind = this.entries.get(urls[i])!.picture ? \"image\" : \"link\";\n text += (text ? \" \" : \"\") + referenceMarkdown(kind, urls[i], name);\n });\n const where = at ?? surface.getSelection() ?? { anchor: source.length, head: source.length };\n const map = surface.getCaretMap();\n let start = nearestStop(map, Math.min(where.anchor, where.head));\n let end = nearestStop(map, Math.max(where.anchor, where.head));\n\n /* DX-3140: code is never inline-parsed - a fenced or indented block embeds\n its body raw, and a span's content is literal text by definition - so a\n `` written inside either is inert forever: no frame,\n nothing in the strip, and `findUnstoredImages` (which walks the same\n frames) never counts it, so no warning ever fires and a dead local\n address sits in the saved text. Landing just past the enclosing\n construct instead keeps the paste/drop/pick and never loses it: a\n block gets its own paragraph (`reshapeForCodeBoundary`); a SPAN gets no\n reshaping at all - DELIBERATE (code review round 2): it is an ordinary\n same-line insertion at the redirected offset, exactly like landing\n anywhere else in this pipeline, so whatever immediately follows the\n span (more prose, or nothing) is abutted with no space invented - the\n same as typing would leave it, and not a second formatting policy only\n code spans get. */\n const enclosing = enclosingCode(surface.getProjection(), start);\n if (enclosing) {\n /* Snapped FIRST, and `start` (never `enclosing.end` again below) is\n what decides the reshape too - the two must never be able to\n disagree about where the text is actually landing (DX-3140 code\n review, round 1). */\n start = end = nearestStop(map, enclosing.end);\n if (enclosing.block) text = reshapeForCodeBoundary(source, start, text);\n }\n /* A reference never runs into the reference beside it: `[PDF 1]` and `![Image 2]` written back to back would read as\n one word, so a space goes between them (a block boundary already separates them with its own newlines). */\n if (!enclosing?.block) {\n const references = surface.getProjection().frames.filter((record) => record.frame.kind === \"image\" || record.frame.kind === \"link\");\n if (references.some((record) => record.end === start)) text = ` ${text}`;\n /* A reference inserted straight after a word would read `DX-6551.Image 1`: plain prose gets a space before it\n when the character before is not whitespace. Never at a line start (that character is a newline), after an\n opening bracket, or past a code span (`enclosing`, deliberate above); the neighbouring-reference case above\n has already added its own. */\n else if (!enclosing && start > 0 && !/[\\s(\\[{]/.test(source[start - 1])) text = ` ${text}`;\n if (references.some((record) => record.start === end)) text = `${text} `;\n }\n const caret = start + text.length;\n\n /* One undo step of its own: \"put these files here\" is a different\n thought from the typing on either side of it. */\n surface.breakUndoGroup();\n surface.apply({ start, end, text }, { anchor: caret, head: caret }, \"other\");\n surface.breakUndoGroup();\n\n for (const url of urls) {\n const uploader = this.uploaderFor(this.entries.get(url)!);\n if (uploader) void this.upload(url, uploader);\n }\n this.sync();\n return urls;\n }\n\n /**\n * Uploads a failed file again, with the SAME File it was inserted with.\n *\n * With no uploader configured any more, the file becomes local-only rather\n * than staying \"failed\" - the honest state for something nothing can store.\n */\n retry(src: string): void {\n const url = src.trim();\n const entry = this.entries.get(url);\n if (!entry || entry.state !== \"failed\") return;\n const uploader = this.uploaderFor(entry);\n if (uploader) void this.upload(url, uploader);\n else {\n entry.state = \"local\";\n entry.message = undefined;\n }\n this.changed();\n }\n\n /**\n * Starts uploading every local-only file once an uploader exists.\n *\n * The component calls this when an uploader changes: a file pasted before an\n * app's storage provider mounted should not stay unsaveable when the storage\n * it needed arrives a moment later.\n */\n uploaderChanged(): void {\n const source = this.requireSurface().getSource();\n let started = false;\n for (const [url, entry] of this.entries) {\n /* Only files in the document - one that survives only in the undo\n history is not the author's file right now, and storing it would\n leave an orphan object behind for nothing. */\n if (entry.state !== \"local\" || !source.includes(url)) continue;\n const uploader = this.uploaderFor(entry);\n if (!uploader) continue;\n void this.upload(url, uploader);\n started = true;\n }\n if (started) this.changed();\n }\n\n /**\n * Recomputes the snapshot from the CURRENT document, and releases object\n * URLs nothing can reach any more. Called after every change to the source.\n *\n * THE COUNTS COME FROM `findUnstoredImages`, the same exported function a\n * consumer's save path calls - one detection source, never a second opinion\n * the two could disagree on (DX-3134).\n *\n * AN OBJECT URL IS RELEASED WHEN ITS FILE IS GONE AND SETTLED: not in the\n * document, not in any undo or redo entry (Ctrl+Z could bring it back), and\n * not mid-upload (the upload will swap it wherever it still is). Revoking one\n * any earlier turns an undo into a broken file; never revoking leaks the\n * file's bytes for the life of the page.\n */\n sync(): void {\n const surface = this.surface;\n if (!surface || this.disposed) return;\n const source = surface.getSource();\n\n for (const [url, entry] of this.entries) {\n if (entry.controller || source.includes(url) || surface.remembers(url)) continue;\n this.release(url);\n }\n\n /* ONE COUNT PER REFERENCE IN THE DOCUMENT - every construct\n `findUnstoredImages` returns, so `unstored` is always exactly\n `findUnstoredImages(value).length` and a consumer's own submit-time\n check can never disagree with the editor's (DX-3134). A file pasted\n and then copied within the document is two references, and counts as two. */\n const unstored = findUnstoredImages(source);\n const snapshot: ImagePipelineSnapshot = {\n uploading: 0,\n failed: 0,\n unstored: unstored.length,\n local: 0,\n revision: this.revision,\n };\n for (const reference of unstored) {\n const entry = this.entries.get(reference.src.trim());\n // I18N-ALLOW: file state token compared against the pipeline states\n const state = entry?.state ?? \"foreign\";\n if (state === \"uploading\") snapshot.uploading++;\n else if (state === \"local\") snapshot.local++;\n /* A `blob:` this editor did not mint is as unsaveable as a rejected\n upload and cannot be retried - it counts as failed. */\n else snapshot.failed++;\n }\n\n const last = this.last;\n if (\n last &&\n last.uploading === snapshot.uploading &&\n last.failed === snapshot.failed &&\n last.unstored === snapshot.unstored &&\n last.local === snapshot.local &&\n last.revision === snapshot.revision\n ) {\n return;\n }\n this.last = snapshot;\n this.options.onChange(snapshot);\n }\n\n /**\n * Stops everything: aborts every upload in flight and releases every object\n * URL. The editor is going away, so nothing it minted can be drawn anywhere\n * again - no other editor will render another's `blob:`.\n */\n dispose(): void {\n this.disposed = true;\n this.origins.clear();\n for (const url of [...this.entries.keys()]) this.release(url);\n this.surface = null;\n }\n\n /* --- Internals ---------------------------------------------------------- */\n\n private uploaderFor(entry: Entry): ImageUploader | null {\n return entry.picture ? this.options.uploadImage() : this.options.uploadFile();\n }\n\n private async upload(url: string, uploader: ImageUploader): Promise<void> {\n const entry = this.entries.get(url);\n if (!entry) return;\n const controller = new AbortController();\n entry.state = \"uploading\";\n entry.controller = controller;\n /* Cleared at the START of every attempt, not just overwritten at the end\n (code review, DX-3146): a previous rejection's message must never be\n readable off an entry that is not currently \"failed\". */\n entry.message = undefined;\n\n let stored: string;\n try {\n const result = await uploader(entry.file, { signal: controller.signal });\n stored = usableStoredUrl(result, entry.picture);\n } catch (error) {\n if (controller.signal.aborted) return;\n entry.state = \"failed\";\n entry.controller = null;\n /* Carried onto the entry (DX-3146) so the tile can say WHY, not just\n THAT - the one thing a bare \"failed\" could never say. */\n entry.message = errorMessage(error);\n /* Loud on purpose: a rejected upload is shown on its tile, and the\n reason is the one thing the tile may truncate. */\n console.error(`[MarkdownEditor] upload failed for \"${entry.file.name}\":`, error);\n this.changed();\n return;\n }\n\n /* The swap waits for a stored picture to be in the cache - or for the\n time limit, or for the editor going away, whichever comes first. The\n preload SETTLING is the point, not its outcome: a URL that will not load\n is still the URL the upload returned, and it goes into the document\n regardless. The wait only decides WHEN, never WHETHER. Another file has\n no picture to warm up. */\n if (entry.picture) await this.settled(this.env.preload(stored), controller.signal);\n if (controller.signal.aborted || !this.surface) return;\n\n /* Settled from here on: `sync` releases the object URL the moment no\n document or history entry names it - at once normally, or at\n `compositionend` when the surface had to queue the swap. */\n entry.controller = null;\n /* Recorded in the spelling the text now holds: that is the URL a row, a rename or a remove reads back. */\n const written = markdownDestination(stored);\n this.surface.substitute(url, written);\n this.origins.set(written, url);\n this.sync();\n }\n\n /**\n * Resolves when `work` settles, `preloadTimeoutMs` passes, or `signal`\n * aborts - never rejects. Every timer and listener is cleaned up.\n */\n private settled(work: Promise<unknown>, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", done);\n resolve();\n };\n const timer = setTimeout(done, this.env.preloadTimeoutMs);\n signal.addEventListener(\"abort\", done);\n work.then(done, done);\n });\n }\n\n private release(url: string): void {\n const entry = this.entries.get(url);\n if (!entry) return;\n entry.controller?.abort();\n this.entries.delete(url);\n this.env.revokeObjectURL(url);\n }\n\n /** A file's state moved: re-report, so its tile redraws. */\n private changed(): void {\n if (!this.surface || this.disposed) return;\n this.revision++;\n this.sync();\n }\n\n private requireSurface(): MarkdownSurface {\n if (!this.surface) throw new Error(\"ImagePipeline: attach(surface) before using it\");\n return this.surface;\n }\n}\n\n/**\n * The URL an uploader resolved with, if it is one the document may hold.\n *\n * Throws - which the caller reports as a FAILED upload - for anything an\n * `<img>` in this editor would refuse, and for another `blob:`: writing either\n * into the document would swap a reference that works for one that does not,\n * and call it stored.\n */\nfunction usableStoredUrl(result: unknown, picture: boolean): string {\n const url = (result as { url?: unknown } | null)?.url;\n if (typeof url !== \"string\" || !url.trim()) {\n throw new Error(\"the uploader resolved without a `url` string\");\n }\n if (isUnstoredImageSrc(url) || !(picture ? sanitizeImageSrc(url) : sanitizeHref(url))) {\n throw new Error(`the uploader resolved with a URL a stored file cannot have: ${url.slice(0, 80)}`);\n }\n return url.trim();\n}\n"],"names":["MAX_UPLOAD_ERROR_MESSAGE_LENGTH","errorMessage","error","trimmed","browserEnvironment","file","url","image","ImagePipeline","options","src","entry","mimeType","types","surface","files","at","taken","urls","picture","uploader","source","first","nextReferenceNumber","text","i","name","kind","referenceMarkdown","where","map","start","nearestStop","end","enclosing","enclosingCode","reshapeForCodeBoundary","references","record","caret","started","unstored","findUnstoredImages","snapshot","reference","state","last","controller","stored","result","usableStoredUrl","written","markdownDestination","work","signal","resolve","done","timer","isUnstoredImageSrc","sanitizeImageSrc","sanitizeHref"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { project as f } from "./project.js";
|
|
2
|
+
import { sanitizeHref as u } from "../syntax/markdown/render.js";
|
|
3
|
+
const d = /^\s*blob:/i;
|
|
4
|
+
function l(e) {
|
|
5
|
+
return d.test(e);
|
|
6
|
+
}
|
|
7
|
+
function k(e) {
|
|
8
|
+
if (!/blob:/i.test(e)) return [];
|
|
9
|
+
const t = [];
|
|
10
|
+
for (const n of f(e).frames) {
|
|
11
|
+
const r = n.frame;
|
|
12
|
+
r.kind === "image" ? l(r.src) && t.push({ src: r.src, alt: r.alt, start: n.start, end: n.end }) : r.kind === "link" && l(r.href) && t.push({ src: r.href, alt: g(e, n.content), start: n.start, end: n.end });
|
|
13
|
+
}
|
|
14
|
+
return t.sort((n, r) => n.start - r.start);
|
|
15
|
+
}
|
|
16
|
+
function g(e, t) {
|
|
17
|
+
return t.map((n) => e.slice(n.start, n.end)).join("").replace(/\\([!-/:-@[-`{-~])/g, "$1");
|
|
18
|
+
}
|
|
19
|
+
function S(e) {
|
|
20
|
+
const t = u(e);
|
|
21
|
+
if (t) return /^(mailto|tel|ftp):/i.test(t) ? null : t;
|
|
22
|
+
const n = e.trim();
|
|
23
|
+
return /^data:image[/](png|jpe?g|gif|webp|avif|svg[+]xml)[;,]/i.test(n) ? n : null;
|
|
24
|
+
}
|
|
25
|
+
const p = /[\\[\]*_`<>|!]/g;
|
|
26
|
+
function h(e) {
|
|
27
|
+
return e.trim().replace(/[\s()<>\\]/g, (t) => `%${t.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`);
|
|
28
|
+
}
|
|
29
|
+
function m(e) {
|
|
30
|
+
return e.replace(p, "\\$&");
|
|
31
|
+
}
|
|
32
|
+
function C(e, t, n) {
|
|
33
|
+
return `${e === "image" ? "!" : ""}[${m(n)}](${h(t)})`;
|
|
34
|
+
}
|
|
35
|
+
function A(e, t, n) {
|
|
36
|
+
if (!t.length) throw new Error("substituteAll: cannot substitute an empty string");
|
|
37
|
+
const r = [];
|
|
38
|
+
for (let s = e.indexOf(t); s !== -1; s = e.indexOf(t, s + t.length)) r.push(s);
|
|
39
|
+
if (!r.length) return null;
|
|
40
|
+
const i = n.length - t.length;
|
|
41
|
+
return {
|
|
42
|
+
source: e.split(t).join(n),
|
|
43
|
+
map: (s) => {
|
|
44
|
+
let c = s;
|
|
45
|
+
for (let o = 0; o < r.length; o++) {
|
|
46
|
+
const a = r[o];
|
|
47
|
+
if (s < a + 1) break;
|
|
48
|
+
if (s < a + t.length) return a + o * i + n.length;
|
|
49
|
+
c += i;
|
|
50
|
+
}
|
|
51
|
+
return c;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function I(e, t) {
|
|
56
|
+
let n = null;
|
|
57
|
+
for (const r of e.frames) {
|
|
58
|
+
const i = r.frame.kind;
|
|
59
|
+
i !== "code" && i !== "codeSpan" || t < r.start || t > r.end || (!n || r.end - r.start > n.end - n.start) && (n = { start: r.start, end: r.end, block: i === "code" });
|
|
60
|
+
}
|
|
61
|
+
return n;
|
|
62
|
+
}
|
|
63
|
+
function j(e, t, n) {
|
|
64
|
+
const r = e[t - 1] === `
|
|
65
|
+
`, i = t >= e.length || e[t] === `
|
|
66
|
+
`;
|
|
67
|
+
return `${r ? `
|
|
68
|
+
` : `
|
|
69
|
+
|
|
70
|
+
`}${n}${i ? "" : `
|
|
71
|
+
`}`;
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
I as enclosingCode,
|
|
75
|
+
m as escapeReferenceName,
|
|
76
|
+
k as findUnstoredImages,
|
|
77
|
+
l as isUnstoredImageSrc,
|
|
78
|
+
h as markdownDestination,
|
|
79
|
+
g as referenceLabel,
|
|
80
|
+
C as referenceMarkdown,
|
|
81
|
+
j as reshapeForCodeBoundary,
|
|
82
|
+
S as sanitizeImageSrc,
|
|
83
|
+
A as substituteAll
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sources":["../../../src/lib/markdown/images.ts"],"sourcesContent":["/* ============================================================================\n IMAGES — the pure half of putting a picture into a document.\n\n DX-3134. Everything here is a function of strings: which images in a\n document are not stored yet, how an image is spelled, and how one URL is\n swapped for another without moving anything else. No DOM, no React, no\n clock, for the reason every module in this directory gives — the pieces a\n consumer has to trust (above all `findUnstoredImages`, which gates their\n save button) must be testable with nothing but a string.\n\n WHAT \"UNSTORED\" MEANS, and why it is a URL scheme rather than a registry\n lookup. An image the editor has not finished storing is written into the\n document with an object URL (`blob:`), and an object URL is, by definition,\n a handle into ONE page's memory: it cannot be fetched by the server, by\n another tab, or by this tab after a reload. So a `blob:` src in a saved\n value is a broken image for every reader, whoever minted it — which makes\n the scheme alone the complete, dependency-free answer to \"may this value be\n saved\", and lets a consumer ask it at submit time with no editor in hand.\n ========================================================================= */\n\nimport { project, type Projection } from \"./project\";\nimport { sanitizeHref } from \"../syntax/markdown/render\";\n\n/**\n * A reference to a file that exists only in this page's memory: an image `` or a link\n * `[name](blob:...)` (DXUI-74 - a file the editor stores is a named reference, whatever its kind).\n */\nexport interface UnstoredImage {\n /** The `blob:` URL exactly as the source spells it. */\n src: string;\n /** The reference name: the bracket text. */\n alt: string;\n /** The whole `` or `[name](src)` construct, as source offsets. */\n start: number;\n end: number;\n}\n\nconst UNSTORED_SRC = /^\\s*blob:/i;\n\n/** Whether an image src names a picture that has not been stored anywhere. */\nexport function isUnstoredImageSrc(src: string): boolean {\n return UNSTORED_SRC.test(src);\n}\n\n/**\n * Every image and link in `markdown` whose destination is a `blob:` URL, in source order.\n *\n * THE SINGLE DETECTION SOURCE. The editor's own warning strip, its\n * `onImageUploadStateChange` counts and its `beforeunload` guard all read this\n * function, and it is exported so a consumer's save path can re-check the\n * exact value it is about to persist with the same answer (DX-3134, PLN-10\n * \"Pending-state event\").\n *\n * Read from the PARSER, not with a regex, for the reason `constructAt` gives:\n * the parser has already decided what is an image, including the cases a\n * pattern gets wrong — a `` inside a code span is prose, not a\n * picture, and saving it loses nothing.\n */\nexport function findUnstoredImages(markdown: string): UnstoredImage[] {\n /* The overwhelmingly common document holds no object URL at all, and this\n runs on every edit — so the parse is only paid for when there is anything\n for it to find. */\n if (!/blob:/i.test(markdown)) return [];\n const found: UnstoredImage[] = [];\n for (const record of project(markdown).frames) {\n const frame = record.frame;\n if (frame.kind === \"image\") {\n if (isUnstoredImageSrc(frame.src)) found.push({ src: frame.src, alt: frame.alt, start: record.start, end: record.end });\n } else if (frame.kind === \"link\" && isUnstoredImageSrc(frame.href)) {\n found.push({ src: frame.href, alt: referenceLabel(markdown, record.content), start: record.start, end: record.end });\n }\n }\n return found.sort((a, b) => a.start - b.start);\n}\n\n/**\n * The bracket text of a link or image as the person reads it: the source slice with markdown backslash escapes\n * undone (`Bob \\[final\\]\\!` reads `Bob [final]!`). It is the inverse of `escapeReferenceName`, so a rename that\n * is read back and saved again never grows backslashes.\n */\nexport function referenceLabel(source: string, content: readonly { start: number; end: number }[]): string {\n return content.map((range) => source.slice(range.start, range.end)).join(\"\").replace(/\\\\([!-/:-@[-`{-~])/g, \"$1\");\n}\n\n/* --- What an image src may be ----------------------------------------------- */\n\n/**\n * What a stored file's URL may be, and what a tile's `<img>` may load.\n *\n * `sanitizeHref` allows only `http(s)`, `mailto`, `tel` and `ftp`, because a link is something a person\n * clicks and `data:text/html` is a working attack. That rule is not loosened: this only narrows it to\n * `http(s)` and relative URLs, since the other three name nothing to load, and adds `data:image/*`, how an\n * inline avatar, an icon or a pasted screenshot is written. That narrow addition is safe because an SVG\n * loaded through `<img>` has scripting disabled by specification. `blob:` is refused here and stays\n * refused: an object URL is only rendered when the editor that minted it vouches for it.\n */\nexport function sanitizeImageSrc(src: string): string | null {\n const linked = sanitizeHref(src);\n if (linked) return /^(mailto|tel|ftp):/i.test(linked) ? null : linked;\n const clean = src.trim();\n return /^data:image[/](png|jpe?g|gif|webp|avif|svg[+]xml)[;,]/i.test(clean) ? clean : null;\n}\n\n/* --- Spelling a reference --------------------------------------------------- */\n\n/**\n * Characters that would change what the alt text MEANS if written bare.\n *\n * A file called `[draft] *final*.png` is an ordinary file name and, unescaped,\n * an image whose alt closes early and whose remaining text turns into\n * emphasis. `|` is here because an image inserted into a table cell would\n * otherwise end the cell.\n */\nconst ALT_SPECIAL = /[\\\\[\\]*_`<>|!]/g;\n\n/**\n * A URL written so the destination parses as exactly that URL.\n *\n * Whitespace ends a destination, an unbalanced parenthesis ends the construct,\n * and a backslash before punctuation is an escape markdown would consume — so\n * all of them are percent-encoded, which is the same URL to every server and\n * the only spelling that survives being written into markdown.\n */\nexport function markdownDestination(url: string): string {\n return url.trim().replace(/[\\s()<>\\\\]/g, (ch) => `%${ch.charCodeAt(0).toString(16).toUpperCase().padStart(2, \"0\")}`);\n}\n\n/** `name` written so it reads back as exactly that bracket text. */\nexport function escapeReferenceName(name: string): string {\n return name.replace(ALT_SPECIAL, \"\\\\$&\");\n}\n\n/** `` for a picture, `[name](src)` for any other file, with both halves escaped so they read back as themselves. */\nexport function referenceMarkdown(kind: \"image\" | \"link\", src: string, name: string): string {\n return `${kind === \"image\" ? \"!\" : \"\"}[${escapeReferenceName(name)}](${markdownDestination(src)})`;\n}\n\n/* --- Swapping one URL for another ----------------------------------------- */\n\n/** The result of replacing every occurrence of one string with another. */\nexport interface Substitution {\n source: string;\n /** Carries an offset in the old source to the same place in the new one. */\n map: (offset: number) => number;\n}\n\n/**\n * Replaces EVERY occurrence of `from` in `source` with `to`, or returns null\n * when there is none.\n *\n * A PLAIN TEXT REPLACEMENT, deliberately, and only safe because of what `from`\n * is: an object URL this editor minted, which embeds a random UUID and was\n * never typed by anyone. Every occurrence of it is that image, whatever\n * construct holds it now — including one the author has since turned into a\n * link, which a parser-driven swap would leave pointing at a dead handle in\n * the saved value (DX-3134).\n *\n * `map` is what lets the caret survive the swap: offsets before an occurrence\n * stay, offsets after one shift by the length change, and an offset that was\n * INSIDE a replaced URL lands at the end of its replacement.\n */\nexport function substituteAll(source: string, from: string, to: string): Substitution | null {\n if (!from.length) throw new Error(\"substituteAll: cannot substitute an empty string\");\n const hits: number[] = [];\n for (let at = source.indexOf(from); at !== -1; at = source.indexOf(from, at + from.length)) hits.push(at);\n if (!hits.length) return null;\n\n const delta = to.length - from.length;\n return {\n source: source.split(from).join(to),\n map: (offset) => {\n let shifted = offset;\n for (let i = 0; i < hits.length; i++) {\n const start = hits[i];\n if (offset < start + 1) break;\n if (offset < start + from.length) return start + i * delta + to.length;\n shifted += delta;\n }\n return shifted;\n },\n };\n}\n\n/* --- Never landing an image inside code (DX-3140) -------------------------- */\n\n/** The innermost code construct containing an offset — see `enclosingCode`. */\nexport interface CodeConstruct {\n end: number;\n block: boolean;\n}\n\n/**\n * The innermost code construct — fenced block, indented block, or inline span\n * — containing `offset`, or null when `offset` sits in ordinary prose.\n *\n * DX-3140: read from the PROJECTION, the same source `marksAt`/`constructAt`\n * in `convert.ts` use, rather than re-deriving fence syntax with a second\n * regex — `blockAt`'s own `fenceAround` regex only ever recognises a FENCED\n * block, so it would miss an indented one entirely, and every code kind here\n * (fenced, indented, span) shares exactly one frame shape either way: the\n * parser has already decided the boundary in every case a hand-rolled pattern\n * gets wrong. Boundaries are inclusive on both ends, matching `marksAt` — a\n * caret at either edge still reads as inside. When several code frames\n * contain `offset` (a nested case the grammar does not produce today), the\n * outermost one wins, so the image lands past all of them, not between two.\n *\n * SHARED, not private to the image pipeline: `insertImage` below is public\n * API (`src/index.ts`), so a consumer calling it directly with a selection\n * inside a code construct is exactly as able to write dead `` text into\n * code as a paste ever was — the ONE check has to live somewhere both paths\n * reach, not be re-derived per caller.\n */\nexport function enclosingCode(projection: Projection, offset: number): CodeConstruct | null {\n let found: { start: number; end: number; block: boolean } | null = null;\n for (const record of projection.frames) {\n const kind = record.frame.kind;\n if (kind !== \"code\" && kind !== \"codeSpan\") continue;\n if (offset < record.start || offset > record.end) continue;\n if (!found || record.end - record.start > found.end - found.start) {\n found = { start: record.start, end: record.end, block: kind === \"code\" };\n }\n }\n return found;\n}\n\n/**\n * The text to actually write at `at` when it sits at the boundary of a code\n * BLOCK (fenced or indented) — reshaped so it lands cleanly outside it.\n *\n * CALLERS MUST PASS THE SAME `at` THEY ACTUALLY SPLICE AT, and nothing else —\n * this was a real bug (DX-3140 code review, round 1): reading the boundary\n * characters from `enclosingCode`'s raw `end` while splicing at a DIFFERENT,\n * caret-map-snapped offset meant the two could disagree, most detectably when\n * `nearestStop` ever moved the insertion point off `end`. There being exactly\n * ONE offset in this function's signature makes that class of drift\n * impossible to reintroduce by construction, rather than by convention.\n *\n * A BLOCK FRAME ALREADY OWNS ITS OWN TRAILING NEWLINE, when one exists (`at`\n * sits at the START of the next line, not at the fence's last backtick) — so\n * blindly prefixing \"\\n\\n\" would stack a THIRD newline on top of the one\n * already there, splitting the image from the code by a full extra blank\n * line no author asked for. Reading what is already on each side of `at` and\n * adding only what is missing keeps it to exactly one blank line before the\n * image, and puts it on its own line after, whatever originally followed the\n * block (nothing, a line right away, or an existing blank line of its own).\n *\n * A SPAN NEEDS NO RESHAPING — it just continues the line it was on — so this\n * is only ever called for `enclosingCode(...).block === true`.\n */\nexport function reshapeForCodeBoundary(source: string, at: number, text: string): string {\n const before = source[at - 1] === \"\\n\";\n const afterIsNewlineOrEnd = at >= source.length || source[at] === \"\\n\";\n return `${before ? \"\\n\" : \"\\n\\n\"}${text}${afterIsNewlineOrEnd ? \"\" : \"\\n\"}`;\n}\n"],"names":["UNSTORED_SRC","isUnstoredImageSrc","src","findUnstoredImages","markdown","found","record","project","frame","referenceLabel","a","b","source","content","range","sanitizeImageSrc","linked","sanitizeHref","clean","ALT_SPECIAL","markdownDestination","url","ch","escapeReferenceName","name","referenceMarkdown","kind","substituteAll","from","to","hits","at","delta","offset","shifted","i","start","enclosingCode","projection","reshapeForCodeBoundary","text","before","afterIsNewlineOrEnd"],"mappings":"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"}
|