@flanksource/clicky-ui 0.2.21 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/comments/CommentAuthor.cjs +58 -0
- package/dist/comments/CommentAuthor.cjs.map +1 -0
- package/dist/comments/CommentAuthor.d.ts +17 -0
- package/dist/comments/CommentAuthor.d.ts.map +1 -0
- package/dist/comments/CommentAuthor.js +58 -0
- package/dist/comments/CommentAuthor.js.map +1 -0
- package/dist/comments/CommentCard.cjs +343 -0
- package/dist/comments/CommentCard.cjs.map +1 -0
- package/dist/comments/CommentCard.d.ts +27 -0
- package/dist/comments/CommentCard.d.ts.map +1 -0
- package/dist/comments/CommentCard.js +343 -0
- package/dist/comments/CommentCard.js.map +1 -0
- package/dist/comments/CommentComposer.cjs +207 -0
- package/dist/comments/CommentComposer.cjs.map +1 -0
- package/dist/comments/CommentComposer.d.ts +23 -0
- package/dist/comments/CommentComposer.d.ts.map +1 -0
- package/dist/comments/CommentComposer.js +207 -0
- package/dist/comments/CommentComposer.js.map +1 -0
- package/dist/comments/CommentFilterBar.cjs +145 -0
- package/dist/comments/CommentFilterBar.cjs.map +1 -0
- package/dist/comments/CommentFilterBar.d.ts +15 -0
- package/dist/comments/CommentFilterBar.d.ts.map +1 -0
- package/dist/comments/CommentFilterBar.js +145 -0
- package/dist/comments/CommentFilterBar.js.map +1 -0
- package/dist/comments/CommentMarkdown.cjs +156 -0
- package/dist/comments/CommentMarkdown.cjs.map +1 -0
- package/dist/comments/CommentMarkdown.d.ts +13 -0
- package/dist/comments/CommentMarkdown.d.ts.map +1 -0
- package/dist/comments/CommentMarkdown.js +156 -0
- package/dist/comments/CommentMarkdown.js.map +1 -0
- package/dist/comments/CommentProgress.cjs +86 -0
- package/dist/comments/CommentProgress.cjs.map +1 -0
- package/dist/comments/CommentProgress.d.ts +16 -0
- package/dist/comments/CommentProgress.d.ts.map +1 -0
- package/dist/comments/CommentProgress.js +86 -0
- package/dist/comments/CommentProgress.js.map +1 -0
- package/dist/comments/CommentProvider.cjs +99 -0
- package/dist/comments/CommentProvider.cjs.map +1 -0
- package/dist/comments/CommentProvider.d.ts +19 -0
- package/dist/comments/CommentProvider.d.ts.map +1 -0
- package/dist/comments/CommentProvider.js +99 -0
- package/dist/comments/CommentProvider.js.map +1 -0
- package/dist/comments/CommentSidePanel.cjs +219 -0
- package/dist/comments/CommentSidePanel.cjs.map +1 -0
- package/dist/comments/CommentSidePanel.d.ts +16 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -0
- package/dist/comments/CommentSidePanel.js +219 -0
- package/dist/comments/CommentSidePanel.js.map +1 -0
- package/dist/comments/CommentThread.cjs +57 -0
- package/dist/comments/CommentThread.cjs.map +1 -0
- package/dist/comments/CommentThread.d.ts +24 -0
- package/dist/comments/CommentThread.d.ts.map +1 -0
- package/dist/comments/CommentThread.js +57 -0
- package/dist/comments/CommentThread.js.map +1 -0
- package/dist/comments/CommentThreadList.cjs +124 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -0
- package/dist/comments/CommentThreadList.d.ts +25 -0
- package/dist/comments/CommentThreadList.d.ts.map +1 -0
- package/dist/comments/CommentThreadList.js +124 -0
- package/dist/comments/CommentThreadList.js.map +1 -0
- package/dist/comments/GroupedComments.cjs +74 -0
- package/dist/comments/GroupedComments.cjs.map +1 -0
- package/dist/comments/GroupedComments.d.ts +18 -0
- package/dist/comments/GroupedComments.d.ts.map +1 -0
- package/dist/comments/GroupedComments.js +74 -0
- package/dist/comments/GroupedComments.js.map +1 -0
- package/dist/comments/MentionTextarea.cjs +253 -0
- package/dist/comments/MentionTextarea.cjs.map +1 -0
- package/dist/comments/MentionTextarea.d.ts +28 -0
- package/dist/comments/MentionTextarea.d.ts.map +1 -0
- package/dist/comments/MentionTextarea.js +253 -0
- package/dist/comments/MentionTextarea.js.map +1 -0
- package/dist/comments/comment-context.cjs +33 -0
- package/dist/comments/comment-context.cjs.map +1 -0
- package/dist/comments/comment-context.d.ts +32 -0
- package/dist/comments/comment-context.d.ts.map +1 -0
- package/dist/comments/comment-context.js +33 -0
- package/dist/comments/comment-context.js.map +1 -0
- package/dist/comments/comment-fixtures.d.ts +11 -0
- package/dist/comments/comment-fixtures.d.ts.map +1 -0
- package/dist/comments/comment-types.cjs +19 -0
- package/dist/comments/comment-types.cjs.map +1 -0
- package/dist/comments/comment-types.d.ts +170 -0
- package/dist/comments/comment-types.d.ts.map +1 -0
- package/dist/comments/comment-types.js +19 -0
- package/dist/comments/comment-types.js.map +1 -0
- package/dist/comments/comment-utils.cjs +216 -0
- package/dist/comments/comment-utils.cjs.map +1 -0
- package/dist/comments/comment-utils.d.ts +59 -0
- package/dist/comments/comment-utils.d.ts.map +1 -0
- package/dist/comments/comment-utils.js +216 -0
- package/dist/comments/comment-utils.js.map +1 -0
- package/dist/comments.cjs +57 -0
- package/dist/comments.cjs.map +1 -0
- package/dist/comments.d.ts +16 -0
- package/dist/comments.d.ts.map +1 -0
- package/dist/comments.js +57 -0
- package/dist/comments.js.map +1 -0
- package/dist/components/Combobox.cjs +5 -2
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +5 -2
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/FilterBar.cjs +293 -256
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +293 -256
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +22 -6
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +25 -9
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +29 -32
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +30 -33
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/NamespacePicker.cjs +52 -0
- package/dist/components/NamespacePicker.cjs.map +1 -0
- package/dist/components/NamespacePicker.d.ts +17 -0
- package/dist/components/NamespacePicker.d.ts.map +1 -0
- package/dist/components/NamespacePicker.js +52 -0
- package/dist/components/NamespacePicker.js.map +1 -0
- package/dist/components/TimeRange.cjs +29 -37
- package/dist/components/TimeRange.cjs.map +1 -1
- package/dist/components/TimeRange.d.ts.map +1 -1
- package/dist/components/TimeRange.js +30 -38
- package/dist/components/TimeRange.js.map +1 -1
- package/dist/components/TreePickerField.cjs +6 -3
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +6 -3
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/form-lookup-context.cjs +36 -0
- package/dist/components/form-lookup-context.cjs.map +1 -0
- package/dist/components/form-lookup-context.d.ts +9 -0
- package/dist/components/form-lookup-context.d.ts.map +1 -0
- package/dist/components/form-lookup-context.js +36 -0
- package/dist/components/form-lookup-context.js.map +1 -0
- package/dist/components/icon-menu-picker.cjs +9 -3
- package/dist/components/icon-menu-picker.cjs.map +1 -1
- package/dist/components/icon-menu-picker.d.ts.map +1 -1
- package/dist/components/icon-menu-picker.js +9 -3
- package/dist/components/icon-menu-picker.js.map +1 -1
- package/dist/components/json-schema-form-discriminator.cjs +67 -0
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
- package/dist/components/json-schema-form-discriminator.d.ts +10 -0
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
- package/dist/components/json-schema-form-discriminator.js +67 -0
- package/dist/components/json-schema-form-discriminator.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +146 -3
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +22 -0
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +147 -4
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-grid.cjs +92 -0
- package/dist/components/json-schema-form-grid.cjs.map +1 -0
- package/dist/components/json-schema-form-grid.d.ts +9 -0
- package/dist/components/json-schema-form-grid.d.ts.map +1 -0
- package/dist/components/json-schema-form-grid.js +92 -0
- package/dist/components/json-schema-form-grid.js.map +1 -0
- package/dist/components/json-schema-form-refs.cjs +60 -0
- package/dist/components/json-schema-form-refs.cjs.map +1 -0
- package/dist/components/json-schema-form-refs.d.ts +3 -0
- package/dist/components/json-schema-form-refs.d.ts.map +1 -0
- package/dist/components/json-schema-form-refs.js +60 -0
- package/dist/components/json-schema-form-refs.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +34 -5
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +36 -7
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +29 -2
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +29 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-template-menu.cjs +83 -0
- package/dist/components/json-schema-form-template-menu.cjs.map +1 -0
- package/dist/components/json-schema-form-template-menu.d.ts +15 -0
- package/dist/components/json-schema-form-template-menu.d.ts.map +1 -0
- package/dist/components/json-schema-form-template-menu.js +83 -0
- package/dist/components/json-schema-form-template-menu.js.map +1 -0
- package/dist/components/json-schema-form-template.cjs +18 -0
- package/dist/components/json-schema-form-template.cjs.map +1 -0
- package/dist/components/json-schema-form-template.d.ts +13 -0
- package/dist/components/json-schema-form-template.d.ts.map +1 -0
- package/dist/components/json-schema-form-template.js +18 -0
- package/dist/components/json-schema-form-template.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +41 -2
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +8 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +1 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +8 -0
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/workload-picker-utils.cjs.map +1 -1
- package/dist/components/workload-picker-utils.d.ts +11 -1
- package/dist/components/workload-picker-utils.d.ts.map +1 -1
- package/dist/components/workload-picker-utils.js.map +1 -1
- package/dist/components.cjs +10 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +7 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +10 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +231 -69
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +7 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.fixtures.d.ts +3 -1
- package/dist/data/Clicky.fixtures.d.ts.map +1 -1
- package/dist/data/Clicky.js +232 -70
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +23 -17
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +7 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +24 -18
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/ExecutionTree.cjs +68 -0
- package/dist/data/ExecutionTree.cjs.map +1 -0
- package/dist/data/ExecutionTree.d.ts +40 -0
- package/dist/data/ExecutionTree.d.ts.map +1 -0
- package/dist/data/ExecutionTree.js +68 -0
- package/dist/data/ExecutionTree.js.map +1 -0
- package/dist/data/Gauge.cjs +37 -4
- package/dist/data/Gauge.cjs.map +1 -1
- package/dist/data/Gauge.d.ts +6 -1
- package/dist/data/Gauge.d.ts.map +1 -1
- package/dist/data/Gauge.js +37 -4
- package/dist/data/Gauge.js.map +1 -1
- package/dist/data/GaugeHoverCard.cjs +35 -0
- package/dist/data/GaugeHoverCard.cjs.map +1 -0
- package/dist/data/GaugeHoverCard.d.ts +25 -0
- package/dist/data/GaugeHoverCard.d.ts.map +1 -0
- package/dist/data/GaugeHoverCard.js +35 -0
- package/dist/data/GaugeHoverCard.js.map +1 -0
- package/dist/data/MarkdownEditor.cjs +616 -0
- package/dist/data/MarkdownEditor.cjs.map +1 -0
- package/dist/data/MarkdownEditor.d.ts +61 -0
- package/dist/data/MarkdownEditor.d.ts.map +1 -0
- package/dist/data/MarkdownEditor.js +616 -0
- package/dist/data/MarkdownEditor.js.map +1 -0
- package/dist/data/MarkdownEditor.model.cjs +27 -0
- package/dist/data/MarkdownEditor.model.cjs.map +1 -0
- package/dist/data/MarkdownEditor.model.d.ts +38 -0
- package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
- package/dist/data/MarkdownEditor.model.js +27 -0
- package/dist/data/MarkdownEditor.model.js.map +1 -0
- package/dist/data/ObjectGraph.cjs +44 -0
- package/dist/data/ObjectGraph.cjs.map +1 -0
- package/dist/data/ObjectGraph.d.ts +39 -0
- package/dist/data/ObjectGraph.d.ts.map +1 -0
- package/dist/data/ObjectGraph.js +44 -0
- package/dist/data/ObjectGraph.js.map +1 -0
- package/dist/data/SchemaViewer.cjs +152 -0
- package/dist/data/SchemaViewer.cjs.map +1 -0
- package/dist/data/SchemaViewer.d.ts +27 -0
- package/dist/data/SchemaViewer.d.ts.map +1 -0
- package/dist/data/SchemaViewer.js +152 -0
- package/dist/data/SchemaViewer.js.map +1 -0
- package/dist/data/TimeseriesCoreBars.cjs +169 -32
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts +42 -5
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +170 -33
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
- package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
- package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.js +5 -5
- package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +132 -36
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts +15 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +133 -37
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +371 -0
- package/dist/data/WorkloadCard.cjs.map +1 -0
- package/dist/data/WorkloadCard.d.ts +25 -0
- package/dist/data/WorkloadCard.d.ts.map +1 -0
- package/dist/data/WorkloadCard.js +371 -0
- package/dist/data/WorkloadCard.js.map +1 -0
- package/dist/data/WorkloadCard.model.cjs +51 -0
- package/dist/data/WorkloadCard.model.cjs.map +1 -0
- package/dist/data/WorkloadCard.model.d.ts +53 -0
- package/dist/data/WorkloadCard.model.d.ts.map +1 -0
- package/dist/data/WorkloadCard.model.js +51 -0
- package/dist/data/WorkloadCard.model.js.map +1 -0
- package/dist/data/ai/ChatFab.cjs +3 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.d.ts.map +1 -1
- package/dist/data/ai/ChatFab.js +3 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +19 -9
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +4 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +19 -9
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
- package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
- package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
- package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
- package/dist/data/ai/ChatWindowRequestBody.js +20 -0
- package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
- package/dist/data/ai/chat-window-context.cjs +2 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +1 -1
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +2 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/context.cjs.map +1 -1
- package/dist/data/ai/context.d.ts +3 -0
- package/dist/data/ai/context.d.ts.map +1 -1
- package/dist/data/ai/context.js.map +1 -1
- package/dist/data/chat/Chat.cjs +21 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +11 -2
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +22 -2
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Message.cjs +13 -4
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +4 -2
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +13 -4
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +9 -4
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +3 -2
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +9 -4
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/index.d.ts +1 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/gauge-stats.cjs +19 -0
- package/dist/data/gauge-stats.cjs.map +1 -0
- package/dist/data/gauge-stats.d.ts +15 -0
- package/dist/data/gauge-stats.d.ts.map +1 -0
- package/dist/data/gauge-stats.js +19 -0
- package/dist/data/gauge-stats.js.map +1 -0
- package/dist/data/schema-viewer-model.cjs +436 -0
- package/dist/data/schema-viewer-model.cjs.map +1 -0
- package/dist/data/schema-viewer-model.d.ts +64 -0
- package/dist/data/schema-viewer-model.d.ts.map +1 -0
- package/dist/data/schema-viewer-model.js +436 -0
- package/dist/data/schema-viewer-model.js.map +1 -0
- package/dist/data/version-info.cjs +2 -2
- package/dist/data/version-info.js +2 -2
- package/dist/data.cjs +30 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +14 -4
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +31 -1
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-sort.cjs +19 -10
- package/dist/hooks/use-sort.cjs.map +1 -1
- package/dist/hooks/use-sort.d.ts +3 -0
- package/dist/hooks/use-sort.d.ts.map +1 -1
- package/dist/hooks/use-sort.js +19 -10
- package/dist/hooks/use-sort.js.map +1 -1
- package/dist/index.cjs +98 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +6 -10
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +2 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +6 -10
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +50 -38
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +5 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +50 -38
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/HoverCard.cjs +7 -2
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js +7 -2
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Modal.cjs +20 -17
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +21 -18
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/Toast.cjs +9 -1
- package/dist/overlay/Toast.cjs.map +1 -1
- package/dist/overlay/Toast.d.ts.map +1 -1
- package/dist/overlay/Toast.js +9 -1
- package/dist/overlay/Toast.js.map +1 -1
- package/dist/overlay/modalStack.cjs +53 -1
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts +12 -0
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +54 -2
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/overlay/zIndex.cjs +20 -0
- package/dist/overlay/zIndex.cjs.map +1 -0
- package/dist/overlay/zIndex.d.ts +39 -0
- package/dist/overlay/zIndex.d.ts.map +1 -0
- package/dist/overlay/zIndex.js +20 -0
- package/dist/overlay/zIndex.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.cjs +102 -143
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +34 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +105 -146
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +135 -0
- package/dist/rpc/OperationActionBar.cjs.map +1 -0
- package/dist/rpc/OperationActionBar.d.ts +20 -0
- package/dist/rpc/OperationActionBar.d.ts.map +1 -0
- package/dist/rpc/OperationActionBar.js +135 -0
- package/dist/rpc/OperationActionBar.js.map +1 -0
- package/dist/rpc/OperationCatalog.cjs +79 -116
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +8 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +80 -117
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +134 -223
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +135 -224
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/OperationEntityPage.cjs +49 -100
- package/dist/rpc/OperationEntityPage.cjs.map +1 -1
- package/dist/rpc/OperationEntityPage.d.ts +6 -1
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
- package/dist/rpc/OperationEntityPage.js +50 -101
- package/dist/rpc/OperationEntityPage.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +43 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -0
- package/dist/rpc/OperationResultView.d.ts +30 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -0
- package/dist/rpc/OperationResultView.js +43 -0
- package/dist/rpc/OperationResultView.js.map +1 -0
- package/dist/rpc/SchemaActionForm.cjs +102 -0
- package/dist/rpc/SchemaActionForm.cjs.map +1 -0
- package/dist/rpc/SchemaActionForm.d.ts +23 -0
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
- package/dist/rpc/SchemaActionForm.js +102 -0
- package/dist/rpc/SchemaActionForm.js.map +1 -0
- package/dist/rpc/accept-options.cjs.map +1 -1
- package/dist/rpc/accept-options.d.ts +0 -1
- package/dist/rpc/accept-options.d.ts.map +1 -1
- package/dist/rpc/accept-options.js.map +1 -1
- package/dist/rpc/apiClient.cjs +34 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +34 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +4 -4
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +0 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +4 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +1 -0
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +6 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +1 -0
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rowNavigation.cjs +86 -0
- package/dist/rpc/rowNavigation.cjs.map +1 -0
- package/dist/rpc/rowNavigation.d.ts +14 -0
- package/dist/rpc/rowNavigation.d.ts.map +1 -0
- package/dist/rpc/rowNavigation.js +86 -0
- package/dist/rpc/rowNavigation.js.map +1 -0
- package/dist/rpc/schemaActionPath.cjs +22 -0
- package/dist/rpc/schemaActionPath.cjs.map +1 -0
- package/dist/rpc/schemaActionPath.d.ts +4 -0
- package/dist/rpc/schemaActionPath.d.ts.map +1 -0
- package/dist/rpc/schemaActionPath.js +22 -0
- package/dist/rpc/schemaActionPath.js.map +1 -0
- package/dist/rpc/surfaceIconMap.cjs +35 -0
- package/dist/rpc/surfaceIconMap.cjs.map +1 -0
- package/dist/rpc/surfaceIconMap.d.ts +3 -0
- package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
- package/dist/rpc/surfaceIconMap.js +35 -0
- package/dist/rpc/surfaceIconMap.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +2 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -1
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.cjs +4 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +7 -6
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +4 -2
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
- package/dist/rpc/AcceptPicker.cjs +0 -135
- package/dist/rpc/AcceptPicker.cjs.map +0 -1
- package/dist/rpc/AcceptPicker.d.ts +0 -12
- package/dist/rpc/AcceptPicker.d.ts.map +0 -1
- package/dist/rpc/AcceptPicker.js +0 -135
- package/dist/rpc/AcceptPicker.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MentionTextarea.d.ts","sourceRoot":"","sources":["../../src/comments/MentionTextarea.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,wDAAwD;IACxD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAsGF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sHAsL1B,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useRef, useImperativeHandle, useState, useEffect } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { useFloatingZIndex } from "../overlay/modalStack.js";
|
|
6
|
+
import { CommentAuthorAvatar } from "./CommentAuthor.js";
|
|
7
|
+
const MENTION_QUERY = /(^|\s)@([\w.-]*)$/;
|
|
8
|
+
const MAX_RESULTS = 8;
|
|
9
|
+
function detectMention(value, caret) {
|
|
10
|
+
const match = value.slice(0, caret).match(MENTION_QUERY);
|
|
11
|
+
if (!match) return null;
|
|
12
|
+
const query = match[2] ?? "";
|
|
13
|
+
const atIndex = caret - query.length - 1;
|
|
14
|
+
return { atIndex, query };
|
|
15
|
+
}
|
|
16
|
+
function filterMentionables(mentionables, query) {
|
|
17
|
+
const q = query.toLowerCase();
|
|
18
|
+
const matches = q ? mentionables.filter(
|
|
19
|
+
(m) => m.name.toLowerCase().includes(q) || m.id.toLowerCase().includes(q)
|
|
20
|
+
) : mentionables;
|
|
21
|
+
return matches.slice(0, MAX_RESULTS);
|
|
22
|
+
}
|
|
23
|
+
const MIRROR_PROPS = [
|
|
24
|
+
"boxSizing",
|
|
25
|
+
"width",
|
|
26
|
+
"borderTopWidth",
|
|
27
|
+
"borderRightWidth",
|
|
28
|
+
"borderBottomWidth",
|
|
29
|
+
"borderLeftWidth",
|
|
30
|
+
"paddingTop",
|
|
31
|
+
"paddingRight",
|
|
32
|
+
"paddingBottom",
|
|
33
|
+
"paddingLeft",
|
|
34
|
+
"fontStyle",
|
|
35
|
+
"fontVariant",
|
|
36
|
+
"fontWeight",
|
|
37
|
+
"fontStretch",
|
|
38
|
+
"fontSize",
|
|
39
|
+
"lineHeight",
|
|
40
|
+
"fontFamily",
|
|
41
|
+
"textAlign",
|
|
42
|
+
"textTransform",
|
|
43
|
+
"textIndent",
|
|
44
|
+
"letterSpacing",
|
|
45
|
+
"wordSpacing",
|
|
46
|
+
"tabSize",
|
|
47
|
+
"whiteSpace",
|
|
48
|
+
"wordWrap",
|
|
49
|
+
"overflowWrap"
|
|
50
|
+
];
|
|
51
|
+
function caretViewportRect(el, position) {
|
|
52
|
+
if (typeof document === "undefined" || typeof getComputedStyle !== "function") {
|
|
53
|
+
const r = el.getBoundingClientRect();
|
|
54
|
+
return { top: r.top, left: r.left, height: 16 };
|
|
55
|
+
}
|
|
56
|
+
const style = getComputedStyle(el);
|
|
57
|
+
const mirror = document.createElement("div");
|
|
58
|
+
for (const prop of MIRROR_PROPS) mirror.style[prop] = style[prop];
|
|
59
|
+
mirror.style.position = "absolute";
|
|
60
|
+
mirror.style.visibility = "hidden";
|
|
61
|
+
mirror.style.whiteSpace = "pre-wrap";
|
|
62
|
+
mirror.style.overflowWrap = "break-word";
|
|
63
|
+
mirror.style.top = "0";
|
|
64
|
+
mirror.style.left = "-9999px";
|
|
65
|
+
mirror.textContent = el.value.slice(0, position);
|
|
66
|
+
const marker = document.createElement("span");
|
|
67
|
+
marker.textContent = el.value.slice(position) || ".";
|
|
68
|
+
mirror.appendChild(marker);
|
|
69
|
+
document.body.appendChild(mirror);
|
|
70
|
+
const lineHeight = parseInt(style.lineHeight, 10) || parseInt(style.fontSize, 10) || 16;
|
|
71
|
+
const offsetTop = marker.offsetTop;
|
|
72
|
+
const offsetLeft = marker.offsetLeft;
|
|
73
|
+
document.body.removeChild(mirror);
|
|
74
|
+
const rect = el.getBoundingClientRect();
|
|
75
|
+
return {
|
|
76
|
+
top: rect.top + offsetTop - el.scrollTop,
|
|
77
|
+
left: rect.left + offsetLeft - el.scrollLeft,
|
|
78
|
+
height: lineHeight
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const MentionTextarea = forwardRef(function MentionTextarea2({
|
|
82
|
+
value,
|
|
83
|
+
onChange,
|
|
84
|
+
mentionables,
|
|
85
|
+
onMentionSelect,
|
|
86
|
+
onSubmit,
|
|
87
|
+
onCancel,
|
|
88
|
+
placeholder,
|
|
89
|
+
autoFocus,
|
|
90
|
+
rows = 2,
|
|
91
|
+
className,
|
|
92
|
+
"data-testid": dataTestId
|
|
93
|
+
}, forwardedRef) {
|
|
94
|
+
const innerRef = useRef(null);
|
|
95
|
+
useImperativeHandle(
|
|
96
|
+
forwardedRef,
|
|
97
|
+
() => innerRef.current
|
|
98
|
+
);
|
|
99
|
+
const [active, setActive] = useState(null);
|
|
100
|
+
const [caretRect, setCaretRect] = useState(null);
|
|
101
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
102
|
+
const floatingZ = useFloatingZIndex();
|
|
103
|
+
const results = active ? filterMentionables(mentionables, active.query) : [];
|
|
104
|
+
const open = active != null && results.length > 0;
|
|
105
|
+
function refreshMention(el) {
|
|
106
|
+
const next = detectMention(el.value, el.selectionStart ?? el.value.length);
|
|
107
|
+
setActive(next);
|
|
108
|
+
setActiveIndex(0);
|
|
109
|
+
setCaretRect(next ? caretViewportRect(el, el.selectionStart ?? 0) : null);
|
|
110
|
+
}
|
|
111
|
+
function insertMention(m) {
|
|
112
|
+
const el = innerRef.current;
|
|
113
|
+
if (!el || !active) return;
|
|
114
|
+
const caret = el.selectionStart ?? value.length;
|
|
115
|
+
const next = `${value.slice(0, active.atIndex)}@${m.name} ${value.slice(caret)}`;
|
|
116
|
+
const nextCaret = active.atIndex + m.name.length + 2;
|
|
117
|
+
onChange(next);
|
|
118
|
+
onMentionSelect == null ? void 0 : onMentionSelect({ id: m.id, name: m.name, kind: m.kind });
|
|
119
|
+
setActive(null);
|
|
120
|
+
setCaretRect(null);
|
|
121
|
+
requestAnimationFrame(() => {
|
|
122
|
+
el.focus();
|
|
123
|
+
el.setSelectionRange(nextCaret, nextCaret);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function onKeyDown(e) {
|
|
127
|
+
if (open) {
|
|
128
|
+
if (e.key === "ArrowDown") {
|
|
129
|
+
e.preventDefault();
|
|
130
|
+
setActiveIndex((i) => (i + 1) % results.length);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (e.key === "ArrowUp") {
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
setActiveIndex((i) => (i - 1 + results.length) % results.length);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (e.key === "Enter" || e.key === "Tab") {
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
const choice = results[activeIndex];
|
|
141
|
+
if (choice) insertMention(choice);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (e.key === "Escape") {
|
|
145
|
+
e.preventDefault();
|
|
146
|
+
setActive(null);
|
|
147
|
+
setCaretRect(null);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
onSubmit == null ? void 0 : onSubmit();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (e.key === "Escape") {
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
onCancel == null ? void 0 : onCancel();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
if (!autoFocus) return;
|
|
163
|
+
const el = innerRef.current;
|
|
164
|
+
const raf = requestAnimationFrame(() => {
|
|
165
|
+
el == null ? void 0 : el.focus();
|
|
166
|
+
const len = (el == null ? void 0 : el.value.length) ?? 0;
|
|
167
|
+
el == null ? void 0 : el.setSelectionRange(len, len);
|
|
168
|
+
});
|
|
169
|
+
return () => cancelAnimationFrame(raf);
|
|
170
|
+
}, [autoFocus]);
|
|
171
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
172
|
+
/* @__PURE__ */ jsx(
|
|
173
|
+
"textarea",
|
|
174
|
+
{
|
|
175
|
+
ref: innerRef,
|
|
176
|
+
rows,
|
|
177
|
+
value,
|
|
178
|
+
placeholder,
|
|
179
|
+
"data-testid": dataTestId,
|
|
180
|
+
className: cn(
|
|
181
|
+
"w-full resize-none bg-transparent text-sm leading-snug outline-none placeholder:text-muted-foreground/60",
|
|
182
|
+
className
|
|
183
|
+
),
|
|
184
|
+
onChange: (e) => {
|
|
185
|
+
onChange(e.target.value);
|
|
186
|
+
refreshMention(e.target);
|
|
187
|
+
},
|
|
188
|
+
onKeyUp: (e) => refreshMention(e.currentTarget),
|
|
189
|
+
onClick: (e) => refreshMention(e.currentTarget),
|
|
190
|
+
onKeyDown,
|
|
191
|
+
onBlur: () => {
|
|
192
|
+
setActive(null);
|
|
193
|
+
setCaretRect(null);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
open && typeof document !== "undefined" && createPortal(
|
|
198
|
+
/* @__PURE__ */ jsx(
|
|
199
|
+
"ul",
|
|
200
|
+
{
|
|
201
|
+
role: "listbox",
|
|
202
|
+
"data-testid": "mention-popover",
|
|
203
|
+
style: {
|
|
204
|
+
position: "fixed",
|
|
205
|
+
top: ((caretRect == null ? void 0 : caretRect.top) ?? 0) + ((caretRect == null ? void 0 : caretRect.height) ?? 16) + 2,
|
|
206
|
+
left: (caretRect == null ? void 0 : caretRect.left) ?? 0,
|
|
207
|
+
zIndex: floatingZ
|
|
208
|
+
},
|
|
209
|
+
className: "max-h-56 min-w-[12rem] overflow-auto rounded-md border border-border bg-popover py-1 shadow-md",
|
|
210
|
+
children: results.map((m, i) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
211
|
+
"button",
|
|
212
|
+
{
|
|
213
|
+
type: "button",
|
|
214
|
+
role: "option",
|
|
215
|
+
"aria-selected": i === activeIndex,
|
|
216
|
+
onMouseDown: (e) => {
|
|
217
|
+
e.preventDefault();
|
|
218
|
+
insertMention(m);
|
|
219
|
+
},
|
|
220
|
+
onMouseEnter: () => setActiveIndex(i),
|
|
221
|
+
className: cn(
|
|
222
|
+
"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground",
|
|
223
|
+
i === activeIndex && "bg-accent text-accent-foreground"
|
|
224
|
+
),
|
|
225
|
+
children: [
|
|
226
|
+
/* @__PURE__ */ jsx(
|
|
227
|
+
CommentAuthorAvatar,
|
|
228
|
+
{
|
|
229
|
+
author: {
|
|
230
|
+
name: m.name,
|
|
231
|
+
kind: m.kind,
|
|
232
|
+
...m.avatar ? { avatar: m.avatar } : {},
|
|
233
|
+
...m.icon ? { icon: m.icon } : {}
|
|
234
|
+
},
|
|
235
|
+
size: "xs",
|
|
236
|
+
bare: true
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: m.name }),
|
|
240
|
+
m.kind === "agent" && /* @__PURE__ */ jsx("span", { className: "ml-auto text-[10px] text-muted-foreground", children: "agent" })
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
) }, m.id))
|
|
244
|
+
}
|
|
245
|
+
),
|
|
246
|
+
document.body
|
|
247
|
+
)
|
|
248
|
+
] });
|
|
249
|
+
});
|
|
250
|
+
export {
|
|
251
|
+
MentionTextarea
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=MentionTextarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MentionTextarea.js","sources":["../../src/comments/MentionTextarea.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { CommentAuthorAvatar } from \"./CommentAuthor\";\nimport type { CommentMention, CommentMentionable } from \"./comment-types\";\n\nexport type MentionTextareaProps = {\n /** Controlled value. */\n value: string;\n /** Called with the next value on edit or mention insertion. */\n onChange: (value: string) => void;\n /** People/agents offered in the @-mention popover. */\n mentionables: CommentMentionable[];\n /** Fired when a mention is inserted via the popover. */\n onMentionSelect?: (mention: CommentMention) => void;\n /** Enter (without Shift) while the popover is closed. */\n onSubmit?: () => void;\n /** Escape while the popover is closed. */\n onCancel?: () => void;\n placeholder?: string;\n autoFocus?: boolean;\n rows?: number;\n className?: string;\n \"data-testid\"?: string;\n};\n\nconst MENTION_QUERY = /(^|\\s)@([\\w.-]*)$/;\nconst MAX_RESULTS = 8;\n\ntype ActiveMention = { atIndex: number; query: string };\ntype CaretRect = { top: number; left: number; height: number };\n\nfunction detectMention(value: string, caret: number): ActiveMention | null {\n const match = value.slice(0, caret).match(MENTION_QUERY);\n if (!match) return null;\n const query = match[2] ?? \"\";\n const atIndex = caret - query.length - 1;\n return { atIndex, query };\n}\n\nfunction filterMentionables(\n mentionables: CommentMentionable[],\n query: string,\n): CommentMentionable[] {\n const q = query.toLowerCase();\n const matches = q\n ? mentionables.filter(\n (m) =>\n m.name.toLowerCase().includes(q) || m.id.toLowerCase().includes(q),\n )\n : mentionables;\n return matches.slice(0, MAX_RESULTS);\n}\n\nconst MIRROR_PROPS = [\n \"boxSizing\",\n \"width\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"fontStyle\",\n \"fontVariant\",\n \"fontWeight\",\n \"fontStretch\",\n \"fontSize\",\n \"lineHeight\",\n \"fontFamily\",\n \"textAlign\",\n \"textTransform\",\n \"textIndent\",\n \"letterSpacing\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n \"wordWrap\",\n \"overflowWrap\",\n] as const;\n\n// Measures the caret pixel position with an off-screen mirror div that copies the\n// textarea's box metrics — the dependency-free way to anchor a popover at the caret.\nfunction caretViewportRect(\n el: HTMLTextAreaElement,\n position: number,\n): CaretRect {\n if (\n typeof document === \"undefined\" ||\n typeof getComputedStyle !== \"function\"\n ) {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, height: 16 };\n }\n const style = getComputedStyle(el);\n const mirror = document.createElement(\"div\");\n for (const prop of MIRROR_PROPS) mirror.style[prop] = style[prop];\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.overflowWrap = \"break-word\";\n mirror.style.top = \"0\";\n mirror.style.left = \"-9999px\";\n mirror.textContent = el.value.slice(0, position);\n\n const marker = document.createElement(\"span\");\n marker.textContent = el.value.slice(position) || \".\";\n mirror.appendChild(marker);\n document.body.appendChild(mirror);\n\n const lineHeight =\n parseInt(style.lineHeight, 10) || parseInt(style.fontSize, 10) || 16;\n const offsetTop = marker.offsetTop;\n const offsetLeft = marker.offsetLeft;\n document.body.removeChild(mirror);\n\n const rect = el.getBoundingClientRect();\n return {\n top: rect.top + offsetTop - el.scrollTop,\n left: rect.left + offsetLeft - el.scrollLeft,\n height: lineHeight,\n };\n}\n\n/**\n * A textarea with an @-mention autocomplete. Typing `@` opens a caret-anchored\n * popover filtered against `mentionables`; selecting one inserts the name and\n * fires `onMentionSelect`. Enter submits and Escape cancels only when the\n * popover is closed.\n */\nexport const MentionTextarea = forwardRef<\n HTMLTextAreaElement,\n MentionTextareaProps\n>(function MentionTextarea(\n {\n value,\n onChange,\n mentionables,\n onMentionSelect,\n onSubmit,\n onCancel,\n placeholder,\n autoFocus,\n rows = 2,\n className,\n \"data-testid\": dataTestId,\n },\n forwardedRef,\n) {\n const innerRef = useRef<HTMLTextAreaElement>(null);\n useImperativeHandle(\n forwardedRef,\n () => innerRef.current as HTMLTextAreaElement,\n );\n\n const [active, setActive] = useState<ActiveMention | null>(null);\n const [caretRect, setCaretRect] = useState<CaretRect | null>(null);\n const [activeIndex, setActiveIndex] = useState(0);\n const floatingZ = useFloatingZIndex();\n\n const results = active ? filterMentionables(mentionables, active.query) : [];\n const open = active != null && results.length > 0;\n\n function refreshMention(el: HTMLTextAreaElement) {\n const next = detectMention(el.value, el.selectionStart ?? el.value.length);\n setActive(next);\n setActiveIndex(0);\n setCaretRect(next ? caretViewportRect(el, el.selectionStart ?? 0) : null);\n }\n\n function insertMention(m: CommentMentionable) {\n const el = innerRef.current;\n if (!el || !active) return;\n const caret = el.selectionStart ?? value.length;\n const next = `${value.slice(0, active.atIndex)}@${m.name} ${value.slice(caret)}`;\n const nextCaret = active.atIndex + m.name.length + 2;\n onChange(next);\n onMentionSelect?.({ id: m.id, name: m.name, kind: m.kind });\n setActive(null);\n setCaretRect(null);\n requestAnimationFrame(() => {\n el.focus();\n el.setSelectionRange(nextCaret, nextCaret);\n });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLTextAreaElement>) {\n if (open) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => (i + 1) % results.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => (i - 1 + results.length) % results.length);\n return;\n }\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault();\n const choice = results[activeIndex];\n if (choice) insertMention(choice);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setActive(null);\n setCaretRect(null);\n return;\n }\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSubmit?.();\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel?.();\n }\n }\n\n useEffect(() => {\n if (!autoFocus) return;\n const el = innerRef.current;\n const raf = requestAnimationFrame(() => {\n el?.focus();\n const len = el?.value.length ?? 0;\n el?.setSelectionRange(len, len);\n });\n return () => cancelAnimationFrame(raf);\n }, [autoFocus]);\n\n return (\n <>\n <textarea\n ref={innerRef}\n rows={rows}\n value={value}\n placeholder={placeholder}\n data-testid={dataTestId}\n className={cn(\n \"w-full resize-none bg-transparent text-sm leading-snug outline-none placeholder:text-muted-foreground/60\",\n className,\n )}\n onChange={(e) => {\n onChange(e.target.value);\n refreshMention(e.target);\n }}\n onKeyUp={(e) => refreshMention(e.currentTarget)}\n onClick={(e) => refreshMention(e.currentTarget)}\n onKeyDown={onKeyDown}\n onBlur={() => {\n setActive(null);\n setCaretRect(null);\n }}\n />\n {open &&\n typeof document !== \"undefined\" &&\n createPortal(\n <ul\n role=\"listbox\"\n data-testid=\"mention-popover\"\n style={{\n position: \"fixed\",\n top: (caretRect?.top ?? 0) + (caretRect?.height ?? 16) + 2,\n left: caretRect?.left ?? 0,\n zIndex: floatingZ,\n }}\n className=\"max-h-56 min-w-[12rem] overflow-auto rounded-md border border-border bg-popover py-1 shadow-md\"\n >\n {results.map((m, i) => (\n <li key={m.id}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={i === activeIndex}\n // Use mousedown so selection runs before the textarea blur closes the popover.\n onMouseDown={(e) => {\n e.preventDefault();\n insertMention(m);\n }}\n onMouseEnter={() => setActiveIndex(i)}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground\",\n i === activeIndex && \"bg-accent text-accent-foreground\",\n )}\n >\n <CommentAuthorAvatar\n author={{\n name: m.name,\n kind: m.kind,\n ...(m.avatar ? { avatar: m.avatar } : {}),\n ...(m.icon ? { icon: m.icon } : {}),\n }}\n size=\"xs\"\n bare\n />\n <span className=\"truncate\">{m.name}</span>\n {m.kind === \"agent\" && (\n <span className=\"ml-auto text-[10px] text-muted-foreground\">\n agent\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body,\n )}\n </>\n );\n});\n"],"names":["MentionTextarea"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const commentTypes = require("./comment-types.cjs");
|
|
5
|
+
const CommentContext = react.createContext(null);
|
|
6
|
+
function exactAnchorResolver(anchor, registered) {
|
|
7
|
+
if (registered.includes(anchor)) return anchor;
|
|
8
|
+
if (registered.includes(commentTypes.DOCUMENT_ANCHOR)) return commentTypes.DOCUMENT_ANCHOR;
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
function dottedAnchorResolver(anchor, registered) {
|
|
12
|
+
if (registered.includes(anchor)) return anchor;
|
|
13
|
+
let cursor = anchor;
|
|
14
|
+
while (cursor.includes(".")) {
|
|
15
|
+
cursor = cursor.slice(0, cursor.lastIndexOf("."));
|
|
16
|
+
if (registered.includes(cursor)) return cursor;
|
|
17
|
+
}
|
|
18
|
+
return registered.includes(commentTypes.DOCUMENT_ANCHOR) ? commentTypes.DOCUMENT_ANCHOR : null;
|
|
19
|
+
}
|
|
20
|
+
function useCommentContext() {
|
|
21
|
+
const ctx = react.useContext(CommentContext);
|
|
22
|
+
if (!ctx) throw new Error("useCommentContext must be used within a CommentProvider");
|
|
23
|
+
return ctx;
|
|
24
|
+
}
|
|
25
|
+
function useCommentContextOptional() {
|
|
26
|
+
return react.useContext(CommentContext);
|
|
27
|
+
}
|
|
28
|
+
exports.CommentContext = CommentContext;
|
|
29
|
+
exports.dottedAnchorResolver = dottedAnchorResolver;
|
|
30
|
+
exports.exactAnchorResolver = exactAnchorResolver;
|
|
31
|
+
exports.useCommentContext = useCommentContext;
|
|
32
|
+
exports.useCommentContextOptional = useCommentContextOptional;
|
|
33
|
+
//# sourceMappingURL=comment-context.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-context.cjs","sources":["../../src/comments/comment-context.ts"],"sourcesContent":["import { createContext, useContext, type RefObject } from \"react\";\nimport {\n DOCUMENT_ANCHOR,\n type Comment,\n type CommentAnchor,\n type CommentAnchorMeta,\n type CommentCallbacks,\n type CommentConfig,\n} from \"./comment-types\";\n\nexport type CommentRailMode = \"closed\" | \"focused\" | \"all\";\n\n/** Resolves a requested anchor to a registered one (or null). */\nexport type AnchorResolver = (anchor: CommentAnchor, registered: string[]) => string | null;\n\nexport type CommentContextValue = {\n comments: Comment[];\n config: CommentConfig;\n callbacks: CommentCallbacks;\n commentCounts: Record<CommentAnchor, number>;\n commentMeta: Record<CommentAnchor, CommentAnchorMeta>;\n railMode: CommentRailMode;\n focusedAnchor: CommentAnchor | null;\n focusAnchor: (anchor: CommentAnchor) => void;\n openCommentList: () => void;\n closeRail: () => void;\n registerAnchor: (anchor: CommentAnchor, el: HTMLElement | null) => void;\n getAnchorTop: (anchor: CommentAnchor) => number | null;\n contentRef: RefObject<HTMLDivElement | null>;\n highlightAnchor: CommentAnchor | null;\n setHighlightAnchor: (anchor: CommentAnchor | null) => void;\n};\n\nexport const CommentContext = createContext<CommentContextValue | null>(null);\n\n/** Default resolver: exact match, else the document anchor if registered. */\nexport function exactAnchorResolver(anchor: CommentAnchor, registered: string[]): string | null {\n if (registered.includes(anchor)) return anchor;\n if (registered.includes(DOCUMENT_ANCHOR)) return DOCUMENT_ANCHOR;\n return null;\n}\n\n/** Resolver for dotted anchor keys: walks up `a.b.c` → `a.b` → `a` → document. */\nexport function dottedAnchorResolver(anchor: CommentAnchor, registered: string[]): string | null {\n if (registered.includes(anchor)) return anchor;\n let cursor = anchor;\n while (cursor.includes(\".\")) {\n cursor = cursor.slice(0, cursor.lastIndexOf(\".\"));\n if (registered.includes(cursor)) return cursor;\n }\n return registered.includes(DOCUMENT_ANCHOR) ? DOCUMENT_ANCHOR : null;\n}\n\n/** Reads the comment context; throws when used outside a CommentProvider. */\nexport function useCommentContext(): CommentContextValue {\n const ctx = useContext(CommentContext);\n if (!ctx) throw new Error(\"useCommentContext must be used within a CommentProvider\");\n return ctx;\n}\n\n/** Reads the comment context, returning null when no provider is present. */\nexport function useCommentContextOptional(): CommentContextValue | null {\n return useContext(CommentContext);\n}\n"],"names":["createContext","DOCUMENT_ANCHOR","useContext"],"mappings":";;;;AAiCO,MAAM,iBAAiBA,MAAAA,cAA0C,IAAI;AAGrE,SAAS,oBAAoB,QAAuB,YAAqC;AAC9F,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAASC,aAAAA,eAAe,EAAG,QAAOA,aAAAA;AACjD,SAAO;AACT;AAGO,SAAS,qBAAqB,QAAuB,YAAqC;AAC/F,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,SAAS;AACb,SAAO,OAAO,SAAS,GAAG,GAAG;AAC3B,aAAS,OAAO,MAAM,GAAG,OAAO,YAAY,GAAG,CAAC;AAChD,QAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AAAA,EAC1C;AACA,SAAO,WAAW,SAASA,4BAAe,IAAIA,aAAAA,kBAAkB;AAClE;AAGO,SAAS,oBAAyC;AACvD,QAAM,MAAMC,MAAAA,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yDAAyD;AACnF,SAAO;AACT;AAGO,SAAS,4BAAwD;AACtE,SAAOA,MAAAA,WAAW,cAAc;AAClC;;;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
import { Comment, CommentAnchor, CommentAnchorMeta, CommentCallbacks, CommentConfig } from './comment-types';
|
|
3
|
+
export type CommentRailMode = "closed" | "focused" | "all";
|
|
4
|
+
/** Resolves a requested anchor to a registered one (or null). */
|
|
5
|
+
export type AnchorResolver = (anchor: CommentAnchor, registered: string[]) => string | null;
|
|
6
|
+
export type CommentContextValue = {
|
|
7
|
+
comments: Comment[];
|
|
8
|
+
config: CommentConfig;
|
|
9
|
+
callbacks: CommentCallbacks;
|
|
10
|
+
commentCounts: Record<CommentAnchor, number>;
|
|
11
|
+
commentMeta: Record<CommentAnchor, CommentAnchorMeta>;
|
|
12
|
+
railMode: CommentRailMode;
|
|
13
|
+
focusedAnchor: CommentAnchor | null;
|
|
14
|
+
focusAnchor: (anchor: CommentAnchor) => void;
|
|
15
|
+
openCommentList: () => void;
|
|
16
|
+
closeRail: () => void;
|
|
17
|
+
registerAnchor: (anchor: CommentAnchor, el: HTMLElement | null) => void;
|
|
18
|
+
getAnchorTop: (anchor: CommentAnchor) => number | null;
|
|
19
|
+
contentRef: RefObject<HTMLDivElement | null>;
|
|
20
|
+
highlightAnchor: CommentAnchor | null;
|
|
21
|
+
setHighlightAnchor: (anchor: CommentAnchor | null) => void;
|
|
22
|
+
};
|
|
23
|
+
export declare const CommentContext: import('react').Context<CommentContextValue | null>;
|
|
24
|
+
/** Default resolver: exact match, else the document anchor if registered. */
|
|
25
|
+
export declare function exactAnchorResolver(anchor: CommentAnchor, registered: string[]): string | null;
|
|
26
|
+
/** Resolver for dotted anchor keys: walks up `a.b.c` → `a.b` → `a` → document. */
|
|
27
|
+
export declare function dottedAnchorResolver(anchor: CommentAnchor, registered: string[]): string | null;
|
|
28
|
+
/** Reads the comment context; throws when used outside a CommentProvider. */
|
|
29
|
+
export declare function useCommentContext(): CommentContextValue;
|
|
30
|
+
/** Reads the comment context, returning null when no provider is present. */
|
|
31
|
+
export declare function useCommentContextOptional(): CommentContextValue | null;
|
|
32
|
+
//# sourceMappingURL=comment-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-context.d.ts","sourceRoot":"","sources":["../../src/comments/comment-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAE3D,iEAAiE;AACjE,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACtD,QAAQ,EAAE,eAAe,CAAC;IAC1B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACxE,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI,CAAC;IACvD,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7C,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,kBAAkB,EAAE,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,eAAO,MAAM,cAAc,qDAAkD,CAAC;AAE9E,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAI9F;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAQ/F;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,IAAI,mBAAmB,CAIvD;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,IAAI,mBAAmB,GAAG,IAAI,CAEtE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useContext, createContext } from "react";
|
|
2
|
+
import { DOCUMENT_ANCHOR } from "./comment-types.js";
|
|
3
|
+
const CommentContext = createContext(null);
|
|
4
|
+
function exactAnchorResolver(anchor, registered) {
|
|
5
|
+
if (registered.includes(anchor)) return anchor;
|
|
6
|
+
if (registered.includes(DOCUMENT_ANCHOR)) return DOCUMENT_ANCHOR;
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
function dottedAnchorResolver(anchor, registered) {
|
|
10
|
+
if (registered.includes(anchor)) return anchor;
|
|
11
|
+
let cursor = anchor;
|
|
12
|
+
while (cursor.includes(".")) {
|
|
13
|
+
cursor = cursor.slice(0, cursor.lastIndexOf("."));
|
|
14
|
+
if (registered.includes(cursor)) return cursor;
|
|
15
|
+
}
|
|
16
|
+
return registered.includes(DOCUMENT_ANCHOR) ? DOCUMENT_ANCHOR : null;
|
|
17
|
+
}
|
|
18
|
+
function useCommentContext() {
|
|
19
|
+
const ctx = useContext(CommentContext);
|
|
20
|
+
if (!ctx) throw new Error("useCommentContext must be used within a CommentProvider");
|
|
21
|
+
return ctx;
|
|
22
|
+
}
|
|
23
|
+
function useCommentContextOptional() {
|
|
24
|
+
return useContext(CommentContext);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
CommentContext,
|
|
28
|
+
dottedAnchorResolver,
|
|
29
|
+
exactAnchorResolver,
|
|
30
|
+
useCommentContext,
|
|
31
|
+
useCommentContextOptional
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=comment-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-context.js","sources":["../../src/comments/comment-context.ts"],"sourcesContent":["import { createContext, useContext, type RefObject } from \"react\";\nimport {\n DOCUMENT_ANCHOR,\n type Comment,\n type CommentAnchor,\n type CommentAnchorMeta,\n type CommentCallbacks,\n type CommentConfig,\n} from \"./comment-types\";\n\nexport type CommentRailMode = \"closed\" | \"focused\" | \"all\";\n\n/** Resolves a requested anchor to a registered one (or null). */\nexport type AnchorResolver = (anchor: CommentAnchor, registered: string[]) => string | null;\n\nexport type CommentContextValue = {\n comments: Comment[];\n config: CommentConfig;\n callbacks: CommentCallbacks;\n commentCounts: Record<CommentAnchor, number>;\n commentMeta: Record<CommentAnchor, CommentAnchorMeta>;\n railMode: CommentRailMode;\n focusedAnchor: CommentAnchor | null;\n focusAnchor: (anchor: CommentAnchor) => void;\n openCommentList: () => void;\n closeRail: () => void;\n registerAnchor: (anchor: CommentAnchor, el: HTMLElement | null) => void;\n getAnchorTop: (anchor: CommentAnchor) => number | null;\n contentRef: RefObject<HTMLDivElement | null>;\n highlightAnchor: CommentAnchor | null;\n setHighlightAnchor: (anchor: CommentAnchor | null) => void;\n};\n\nexport const CommentContext = createContext<CommentContextValue | null>(null);\n\n/** Default resolver: exact match, else the document anchor if registered. */\nexport function exactAnchorResolver(anchor: CommentAnchor, registered: string[]): string | null {\n if (registered.includes(anchor)) return anchor;\n if (registered.includes(DOCUMENT_ANCHOR)) return DOCUMENT_ANCHOR;\n return null;\n}\n\n/** Resolver for dotted anchor keys: walks up `a.b.c` → `a.b` → `a` → document. */\nexport function dottedAnchorResolver(anchor: CommentAnchor, registered: string[]): string | null {\n if (registered.includes(anchor)) return anchor;\n let cursor = anchor;\n while (cursor.includes(\".\")) {\n cursor = cursor.slice(0, cursor.lastIndexOf(\".\"));\n if (registered.includes(cursor)) return cursor;\n }\n return registered.includes(DOCUMENT_ANCHOR) ? DOCUMENT_ANCHOR : null;\n}\n\n/** Reads the comment context; throws when used outside a CommentProvider. */\nexport function useCommentContext(): CommentContextValue {\n const ctx = useContext(CommentContext);\n if (!ctx) throw new Error(\"useCommentContext must be used within a CommentProvider\");\n return ctx;\n}\n\n/** Reads the comment context, returning null when no provider is present. */\nexport function useCommentContextOptional(): CommentContextValue | null {\n return useContext(CommentContext);\n}\n"],"names":[],"mappings":";;AAiCO,MAAM,iBAAiB,cAA0C,IAAI;AAGrE,SAAS,oBAAoB,QAAuB,YAAqC;AAC9F,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,eAAe,EAAG,QAAO;AACjD,SAAO;AACT;AAGO,SAAS,qBAAqB,QAAuB,YAAqC;AAC/F,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,SAAS;AACb,SAAO,OAAO,SAAS,GAAG,GAAG;AAC3B,aAAS,OAAO,MAAM,GAAG,OAAO,YAAY,GAAG,CAAC;AAChD,QAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AAAA,EAC1C;AACA,SAAO,WAAW,SAAS,eAAe,IAAI,kBAAkB;AAClE;AAGO,SAAS,oBAAyC;AACvD,QAAM,MAAM,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yDAAyD;AACnF,SAAO;AACT;AAGO,SAAS,4BAAwD;AACtE,SAAO,WAAW,cAAc;AAClC;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Comment, CommentAuthor, CommentCallbacks, CommentConfig } from './comment-types';
|
|
2
|
+
export declare const ME: CommentAuthor;
|
|
3
|
+
export declare const sampleConfig: CommentConfig;
|
|
4
|
+
export declare const sampleComments: Comment[];
|
|
5
|
+
/** Stateful in-memory store wiring the controlled callbacks for demos/stories. */
|
|
6
|
+
export declare function useDemoCommentStore(initial?: Comment[]): {
|
|
7
|
+
comments: Comment[];
|
|
8
|
+
callbacks: CommentCallbacks;
|
|
9
|
+
setComments: import('react').Dispatch<import('react').SetStateAction<Comment[]>>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=comment-fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-fixtures.d.ts","sourceRoot":"","sources":["../../src/comments/comment-fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB,eAAO,MAAM,EAAE,EAAE,aAIhB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,aA4C1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAAO,EA+CnC,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,OAAO,EAAmB;;;;EAiDtE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const DOCUMENT_ANCHOR = "__document__";
|
|
4
|
+
const DEFAULT_COMMENT_STATUSES = [
|
|
5
|
+
{ value: "open", label: "Open", tone: "info", unresolved: true },
|
|
6
|
+
{
|
|
7
|
+
value: "in_progress",
|
|
8
|
+
label: "In progress",
|
|
9
|
+
tone: "warning",
|
|
10
|
+
unresolved: true
|
|
11
|
+
},
|
|
12
|
+
{ value: "resolved", label: "Resolved", tone: "success" },
|
|
13
|
+
{ value: "closed", label: "Closed", tone: "neutral" }
|
|
14
|
+
];
|
|
15
|
+
const DEFAULT_CHECKLIST_CYCLE = ["open", "in_progress", "done"];
|
|
16
|
+
exports.DEFAULT_CHECKLIST_CYCLE = DEFAULT_CHECKLIST_CYCLE;
|
|
17
|
+
exports.DEFAULT_COMMENT_STATUSES = DEFAULT_COMMENT_STATUSES;
|
|
18
|
+
exports.DOCUMENT_ANCHOR = DOCUMENT_ANCHOR;
|
|
19
|
+
//# sourceMappingURL=comment-types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-types.cjs","sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (input: CommentCreateInput) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n { value: \"open\", label: \"Open\", tone: \"info\", unresolved: true },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n },\n { value: \"resolved\", label: \"Resolved\", tone: \"success\" },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"names":[],"mappings":";;AAsGO,MAAM,kBAAkB;AA6FxB,MAAM,2BAAkD;AAAA,EAC7D,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,QAAQ,YAAY,KAAA;AAAA,EAC1D;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,EAAA;AAAA,EAEd,EAAE,OAAO,YAAY,OAAO,YAAY,MAAM,UAAA;AAAA,EAC9C,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,UAAA;AAC5C;AAGO,MAAM,0BAA0B,CAAC,QAAQ,eAAe,MAAM;;;;"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { StaticIconComponent } from '../data/Icon';
|
|
3
|
+
/** Semantic tone driving a status/facet color (maps onto Badge tones). */
|
|
4
|
+
export type CommentTone = "default" | "info" | "success" | "warning" | "danger" | "neutral";
|
|
5
|
+
/** A single selectable status (e.g. "open", "resolved"). Consumer-defined. */
|
|
6
|
+
export type CommentStatusConfig = {
|
|
7
|
+
/** Stable value stored on a comment's `status`. */
|
|
8
|
+
value: string;
|
|
9
|
+
/** Human label shown in menus and badges. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Color tone for the status chip. */
|
|
12
|
+
tone?: CommentTone;
|
|
13
|
+
/** Optional leading glyph. */
|
|
14
|
+
icon?: string | StaticIconComponent;
|
|
15
|
+
/**
|
|
16
|
+
* Whether this status counts as "unresolved/open" — drives progress tallies
|
|
17
|
+
* and which groups start expanded. Defaults to false.
|
|
18
|
+
*/
|
|
19
|
+
unresolved?: boolean;
|
|
20
|
+
};
|
|
21
|
+
/** One option of a generic facet (e.g. a "category" value). */
|
|
22
|
+
export type CommentFacetOption = {
|
|
23
|
+
value: string;
|
|
24
|
+
label: string;
|
|
25
|
+
tone?: CommentTone;
|
|
26
|
+
/** Compact glyph for the collapsed card (e.g. "BS" for a category). */
|
|
27
|
+
short?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* A generic, consumer-supplied classification axis. Replaces the financial
|
|
31
|
+
* category/severity vocabulary — any app declares its own facets.
|
|
32
|
+
*/
|
|
33
|
+
export type CommentFacet = {
|
|
34
|
+
/** Key into `Comment.facets`. */
|
|
35
|
+
key: string;
|
|
36
|
+
label: string;
|
|
37
|
+
options: CommentFacetOption[];
|
|
38
|
+
/** Allow several values to be selected at once in the filter bar. */
|
|
39
|
+
multiple?: boolean;
|
|
40
|
+
};
|
|
41
|
+
export type CommentMentionKind = "user" | "agent";
|
|
42
|
+
/** A person or agent that can be @-mentioned in the composer. */
|
|
43
|
+
export type CommentMentionable = {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
/** Image URL for `kind: "user"`. */
|
|
47
|
+
avatar?: string;
|
|
48
|
+
kind: CommentMentionKind;
|
|
49
|
+
/** Glyph override for `kind: "agent"`. */
|
|
50
|
+
icon?: string | StaticIconComponent;
|
|
51
|
+
};
|
|
52
|
+
/** A resolved mention emitted when a comment referencing a mentionable is posted. */
|
|
53
|
+
export type CommentMention = {
|
|
54
|
+
id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
kind: CommentMentionKind;
|
|
57
|
+
};
|
|
58
|
+
/** A labelled group of reference chips (e.g. linked ids). */
|
|
59
|
+
export type CommentRefGroup = {
|
|
60
|
+
label: string;
|
|
61
|
+
items: string[];
|
|
62
|
+
/** Render items in a monospace font. */
|
|
63
|
+
mono?: boolean;
|
|
64
|
+
};
|
|
65
|
+
/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */
|
|
66
|
+
export type CommentChecklistItem = {
|
|
67
|
+
label: string;
|
|
68
|
+
status: string;
|
|
69
|
+
};
|
|
70
|
+
export type CommentAuthor = {
|
|
71
|
+
id?: string;
|
|
72
|
+
name: string;
|
|
73
|
+
kind?: CommentMentionKind;
|
|
74
|
+
avatar?: string;
|
|
75
|
+
/** Glyph override for `kind: "agent"` authors. */
|
|
76
|
+
icon?: string | StaticIconComponent;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* An opaque anchor key locating a comment within a document. Not a JSON path —
|
|
80
|
+
* any stable string a consumer registers via the provider. `null`/absent means
|
|
81
|
+
* document-level.
|
|
82
|
+
*/
|
|
83
|
+
export type CommentAnchor = string;
|
|
84
|
+
/** Anchor key reserved for document-level (un-anchored) comments. */
|
|
85
|
+
export declare const DOCUMENT_ANCHOR = "__document__";
|
|
86
|
+
/** A single comment. Replies set `parentId`; roots leave it null. */
|
|
87
|
+
export type Comment = {
|
|
88
|
+
id: string;
|
|
89
|
+
body: string;
|
|
90
|
+
/** ISO-8601 creation time. */
|
|
91
|
+
createdAt: string;
|
|
92
|
+
/** ISO-8601 last-update time. */
|
|
93
|
+
updatedAt?: string;
|
|
94
|
+
author: CommentAuthor | null;
|
|
95
|
+
/** Key into the configured statuses; roots only. */
|
|
96
|
+
status?: string;
|
|
97
|
+
/** Parent comment id when this is a reply. */
|
|
98
|
+
parentId?: string | null;
|
|
99
|
+
/** Where the comment is anchored; null/absent = document-level. */
|
|
100
|
+
anchor?: CommentAnchor | null;
|
|
101
|
+
/** facet.key → selected option value. */
|
|
102
|
+
facets?: Record<string, string>;
|
|
103
|
+
refs?: CommentRefGroup[];
|
|
104
|
+
checklist?: CommentChecklistItem[];
|
|
105
|
+
};
|
|
106
|
+
/** Payload for creating a new root comment. */
|
|
107
|
+
export type CommentCreateInput = {
|
|
108
|
+
body: string;
|
|
109
|
+
anchor?: CommentAnchor | null;
|
|
110
|
+
facets?: Record<string, string>;
|
|
111
|
+
mentions?: CommentMention[];
|
|
112
|
+
};
|
|
113
|
+
/** Payload for replying to a comment. */
|
|
114
|
+
export type CommentReplyInput = {
|
|
115
|
+
parentId: string;
|
|
116
|
+
body: string;
|
|
117
|
+
anchor?: CommentAnchor | null;
|
|
118
|
+
mentions?: CommentMention[];
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Controlled callbacks. The components own no data fetching; the consumer
|
|
122
|
+
* performs the mutation and feeds the updated `comments` back in.
|
|
123
|
+
*/
|
|
124
|
+
export type CommentCallbacks = {
|
|
125
|
+
onCreate?: (input: CommentCreateInput) => void | Promise<void>;
|
|
126
|
+
onReply?: (input: CommentReplyInput) => void | Promise<void>;
|
|
127
|
+
onUpdateStatus?: (id: string, status: string) => void | Promise<void>;
|
|
128
|
+
onDelete?: (id: string) => void | Promise<void>;
|
|
129
|
+
onChecklistToggle?: (id: string, index: number, next: string) => void | Promise<void>;
|
|
130
|
+
/** Fired when a posted comment references a mentionable. */
|
|
131
|
+
onMention?: (mention: CommentMention, context: {
|
|
132
|
+
body: string;
|
|
133
|
+
}) => void;
|
|
134
|
+
};
|
|
135
|
+
/** Static configuration shared across the comment components. */
|
|
136
|
+
export type CommentConfig = {
|
|
137
|
+
/** Selectable statuses; the first `unresolved` one is the default for new comments. */
|
|
138
|
+
statuses: CommentStatusConfig[];
|
|
139
|
+
/** Classification axes (category/severity/etc.). */
|
|
140
|
+
facets?: CommentFacet[];
|
|
141
|
+
/** People/agents available for @-mention. */
|
|
142
|
+
mentionables?: CommentMentionable[];
|
|
143
|
+
/** Status values a checklist item cycles through on click. */
|
|
144
|
+
checklistStatusCycle?: string[];
|
|
145
|
+
};
|
|
146
|
+
/** Aggregate metadata for one anchor, derived from the comment list. */
|
|
147
|
+
export type CommentAnchorMeta = {
|
|
148
|
+
count: number;
|
|
149
|
+
authors: string[];
|
|
150
|
+
latestStatus?: string;
|
|
151
|
+
};
|
|
152
|
+
/** Selected filter state for the filter bar / `applyCommentFilters`. */
|
|
153
|
+
export type CommentFilters = {
|
|
154
|
+
/** Selected status values; empty = all statuses. */
|
|
155
|
+
statuses: Set<string>;
|
|
156
|
+
/** facet.key → selected option values; empty set = all values for that facet. */
|
|
157
|
+
facets: Record<string, Set<string>>;
|
|
158
|
+
/** Restrict to an author kind, or "all". */
|
|
159
|
+
authorKind?: CommentMentionKind | "all";
|
|
160
|
+
};
|
|
161
|
+
/** Optional renderers passed down to a card. */
|
|
162
|
+
export type CommentRenderOptions = {
|
|
163
|
+
/** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */
|
|
164
|
+
renderBody?: (body: string) => ReactNode;
|
|
165
|
+
};
|
|
166
|
+
/** A domain-free default status set: open / in progress / resolved. */
|
|
167
|
+
export declare const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[];
|
|
168
|
+
/** Default checklist status cycle used when a consumer omits one. */
|
|
169
|
+
export declare const DEFAULT_CHECKLIST_CYCLE: string[];
|
|
170
|
+
//# sourceMappingURL=comment-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-types.d.ts","sourceRoot":"","sources":["../../src/comments/comment-types.ts"],"names":[],"mappings":"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"}
|