@bikdotai/bik-component-library 0.0.850-beta.1 → 0.0.850-beta.3
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/cjs/assets/icons/ShipStation.svg.js +1 -1
- package/dist/cjs/assets/icons/ShipStation.svg.js.map +1 -1
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js +14 -8
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js +1 -1
- package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +5 -5
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/DiscardModal.js +1 -1
- package/dist/cjs/components/agent-builder/components/DiscardModal.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/GoLiveModal.js +1 -1
- package/dist/cjs/components/agent-builder/components/GoLiveModal.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/MentionEditor.js +1 -1
- package/dist/cjs/components/agent-builder/components/MentionEditor.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/MentionPicker.js +32 -24
- package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js +4 -4
- package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/SelectableListSection.js +2 -2
- package/dist/cjs/components/agent-builder/components/SelectableListSection.js.map +1 -1
- package/dist/cjs/components/agent-builder/constants/tools.js +1 -1
- package/dist/cjs/components/agent-builder/constants/tools.js.map +1 -1
- package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js +1 -1
- package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
- package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js +1 -1
- package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
- package/dist/cjs/components/agent-builder/utils/mentionSerialization.js +2 -2
- package/dist/cjs/components/agent-builder/utils/mentionSerialization.js.map +1 -1
- package/dist/cjs/components/agent-builder/utils/sourceIcons.js +1 -1
- package/dist/cjs/components/agent-builder/utils/sourceIcons.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentListing.js +1 -1
- package/dist/cjs/components/agent-listing/AgentListing.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentTable.js +1 -1
- package/dist/cjs/components/agent-listing/AgentTable.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentTableRow.js +1 -1
- package/dist/cjs/components/agent-listing/AgentTableRow.js.map +1 -1
- package/dist/cjs/components/bik-layout/CommonStyles.js +6 -4
- package/dist/cjs/components/bik-layout/CommonStyles.js.map +1 -1
- package/dist/cjs/components/button/themes.js +3 -3
- package/dist/cjs/components/button/themes.js.map +1 -1
- package/dist/cjs/components/datePicker/DatePicker.js +1 -1
- package/dist/cjs/components/datePicker/DatePicker.js.map +1 -1
- package/dist/cjs/components/datePicker/DatePicker.styled.js +14 -20
- package/dist/cjs/components/datePicker/DatePicker.styled.js.map +1 -1
- package/dist/cjs/components/dropdown/ChipInput.js +1 -1
- package/dist/cjs/components/dropdown/ChipInput.js.map +1 -1
- package/dist/cjs/components/dropdown/Common.styled.js +5 -6
- package/dist/cjs/components/dropdown/Common.styled.js.map +1 -1
- package/dist/cjs/components/dropdown/Dropdown.js +1 -1
- package/dist/cjs/components/dropdown/Dropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/OpennedDropdown.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/OpennedDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/searchbox/SearchBox.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/searchbox/SearchBox.js.map +1 -1
- package/dist/cjs/components/input/Input.js +1 -1
- package/dist/cjs/components/input/Input.js.map +1 -1
- package/dist/cjs/components/input/Input.styled.js +12 -25
- package/dist/cjs/components/input/Input.styled.js.map +1 -1
- package/dist/cjs/components/tabs/Tabs.js +1 -1
- package/dist/cjs/components/tabs/Tabs.js.map +1 -1
- package/dist/cjs/components/tabs/Tabs.styles.js +8 -22
- package/dist/cjs/components/tabs/Tabs.styles.js.map +1 -1
- package/dist/cjs/components/tag/Tag.js +1 -1
- package/dist/cjs/components/tag/Tag.js.map +1 -1
- package/dist/cjs/components/tag/Tag.styled.js +0 -4
- package/dist/cjs/components/tag/Tag.styled.js.map +1 -1
- package/dist/cjs/components/tag/model.js.map +1 -1
- package/dist/cjs/editor/BikEditor.js +1 -1
- package/dist/cjs/editor/BikEditor.js.map +1 -1
- package/dist/cjs/editor/BikEditor.styles.js +21 -16
- package/dist/cjs/editor/BikEditor.styles.js.map +1 -1
- package/dist/cjs/editor/BikEditor.types.js.map +1 -1
- package/dist/cjs/editor/extensions/buildExtensions.js +2 -2
- package/dist/cjs/editor/extensions/buildExtensions.js.map +1 -1
- package/dist/cjs/editor/extensions/characterLimit/CharacterLimitExtension.js +3 -3
- package/dist/cjs/editor/extensions/characterLimit/CharacterLimitExtension.js.map +1 -1
- package/dist/cjs/editor/extensions/mention/MentionChipNodeView.js +2 -0
- package/dist/cjs/editor/extensions/mention/MentionChipNodeView.js.map +1 -0
- package/dist/cjs/editor/extensions/mention/MentionExtension.js +1 -1
- package/dist/cjs/editor/extensions/mention/MentionExtension.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/assets/icons/ShipStation.svg.js +2 -2
- package/dist/esm/assets/icons/ShipStation.svg.js.map +1 -1
- package/dist/esm/assets/icons/index.d.ts +1 -0
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js +21 -15
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js +1 -1
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +5 -0
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +243 -227
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/DiscardModal.js +57 -49
- package/dist/esm/components/agent-builder/components/DiscardModal.js.map +1 -1
- package/dist/esm/components/agent-builder/components/GoLiveModal.js +26 -22
- package/dist/esm/components/agent-builder/components/GoLiveModal.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionEditor.d.ts +1 -1
- package/dist/esm/components/agent-builder/components/MentionEditor.js +93 -77
- package/dist/esm/components/agent-builder/components/MentionEditor.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionPicker.js +194 -168
- package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +118 -109
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/SelectableListSection.js +117 -110
- package/dist/esm/components/agent-builder/components/SelectableListSection.js.map +1 -1
- package/dist/esm/components/agent-builder/constants/tools.d.ts +10 -0
- package/dist/esm/components/agent-builder/constants/tools.js +27 -14
- package/dist/esm/components/agent-builder/constants/tools.js.map +1 -1
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.d.ts +6 -2
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js +46 -43
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
- package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +132 -117
- package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
- package/dist/esm/components/agent-builder/utils/mentionSerialization.d.ts +3 -2
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js +24 -19
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
- package/dist/esm/components/agent-builder/utils/sourceIcons.d.ts +9 -1
- package/dist/esm/components/agent-builder/utils/sourceIcons.js +15 -9
- package/dist/esm/components/agent-builder/utils/sourceIcons.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentListing.js +71 -69
- package/dist/esm/components/agent-listing/AgentListing.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentListing.model.d.ts +6 -0
- package/dist/esm/components/agent-listing/AgentTable.d.ts +2 -0
- package/dist/esm/components/agent-listing/AgentTable.js +29 -27
- package/dist/esm/components/agent-listing/AgentTable.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentTableRow.d.ts +2 -0
- package/dist/esm/components/agent-listing/AgentTableRow.js +50 -36
- package/dist/esm/components/agent-listing/AgentTableRow.js.map +1 -1
- package/dist/esm/components/bik-layout/CommonStyles.js +3 -1
- package/dist/esm/components/bik-layout/CommonStyles.js.map +1 -1
- package/dist/esm/components/button/themes.js +1 -1
- package/dist/esm/components/button/themes.js.map +1 -1
- package/dist/esm/components/datePicker/DatePicker.js +21 -22
- package/dist/esm/components/datePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/datePicker/DatePicker.styled.d.ts +0 -10
- package/dist/esm/components/datePicker/DatePicker.styled.js +16 -23
- package/dist/esm/components/datePicker/DatePicker.styled.js.map +1 -1
- package/dist/esm/components/dropdown/ChipInput.d.ts +0 -1
- package/dist/esm/components/dropdown/ChipInput.js +30 -37
- package/dist/esm/components/dropdown/ChipInput.js.map +1 -1
- package/dist/esm/components/dropdown/Common.styled.js +6 -7
- package/dist/esm/components/dropdown/Common.styled.js.map +1 -1
- package/dist/esm/components/dropdown/Dropdown.d.ts +0 -2
- package/dist/esm/components/dropdown/Dropdown.js +89 -96
- package/dist/esm/components/dropdown/Dropdown.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/OpennedDropdown.js +95 -103
- package/dist/esm/components/dropdown/OpenedDropdown/components/OpennedDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/searchbox/SearchBox.d.ts +0 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/searchbox/SearchBox.js +17 -17
- package/dist/esm/components/dropdown/OpenedDropdown/components/searchbox/SearchBox.js.map +1 -1
- package/dist/esm/components/dropdown/type.d.ts +0 -2
- package/dist/esm/components/input/Input.js +101 -104
- package/dist/esm/components/input/Input.js.map +1 -1
- package/dist/esm/components/input/Input.model.d.ts +0 -2
- package/dist/esm/components/input/Input.styled.d.ts +0 -2
- package/dist/esm/components/input/Input.styled.js +25 -38
- package/dist/esm/components/input/Input.styled.js.map +1 -1
- package/dist/esm/components/tabs/Tabs.js +81 -103
- package/dist/esm/components/tabs/Tabs.js.map +1 -1
- package/dist/esm/components/tabs/Tabs.model.d.ts +0 -7
- package/dist/esm/components/tabs/Tabs.styles.d.ts +0 -2
- package/dist/esm/components/tabs/Tabs.styles.js +9 -23
- package/dist/esm/components/tabs/Tabs.styles.js.map +1 -1
- package/dist/esm/components/tag/Tag.d.ts +1 -1
- package/dist/esm/components/tag/Tag.js +15 -17
- package/dist/esm/components/tag/Tag.js.map +1 -1
- package/dist/esm/components/tag/Tag.styled.d.ts +0 -1
- package/dist/esm/components/tag/Tag.styled.js +6 -10
- package/dist/esm/components/tag/Tag.styled.js.map +1 -1
- package/dist/esm/components/tag/model.d.ts +0 -5
- package/dist/esm/components/tag/model.js.map +1 -1
- package/dist/esm/editor/BikEditor.js +129 -126
- package/dist/esm/editor/BikEditor.js.map +1 -1
- package/dist/esm/editor/BikEditor.styles.js +24 -19
- package/dist/esm/editor/BikEditor.styles.js.map +1 -1
- package/dist/esm/editor/BikEditor.types.d.ts +17 -0
- package/dist/esm/editor/BikEditor.types.js.map +1 -1
- package/dist/esm/editor/extensions/buildExtensions.d.ts +7 -0
- package/dist/esm/editor/extensions/buildExtensions.js +30 -24
- package/dist/esm/editor/extensions/buildExtensions.js.map +1 -1
- package/dist/esm/editor/extensions/characterLimit/CharacterLimitExtension.d.ts +20 -3
- package/dist/esm/editor/extensions/characterLimit/CharacterLimitExtension.js +40 -25
- package/dist/esm/editor/extensions/characterLimit/CharacterLimitExtension.js.map +1 -1
- package/dist/esm/editor/extensions/mention/MentionChipNodeView.d.ts +17 -0
- package/dist/esm/editor/extensions/mention/MentionChipNodeView.js +39 -0
- package/dist/esm/editor/extensions/mention/MentionChipNodeView.js.map +1 -0
- package/dist/esm/editor/extensions/mention/MentionExtension.d.ts +1 -1
- package/dist/esm/editor/extensions/mention/MentionExtension.js +67 -45
- package/dist/esm/editor/extensions/mention/MentionExtension.js.map +1 -1
- package/dist/esm/index.js +761 -759
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CharacterLimitExtension.js","sources":["../../../../../src/editor/extensions/characterLimit/CharacterLimitExtension.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nexport interface CharacterLimitOptions {\n\t/** Soft character limit. 0 / undefined disables the extension entirely. */\n\tlimit: number;\n}\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"CharacterLimitExtension.js","sources":["../../../../../src/editor/extensions/characterLimit/CharacterLimitExtension.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nexport interface CharacterLimitOptions {\n\t/** Soft character limit. 0 / undefined disables the extension entirely. */\n\tlimit: number;\n\t/**\n\t * Hard mode. When true, NO edit may push the content past the limit — typing,\n\t * Enter, drag-drop and any paste the consumer didn't pre-trim are all rejected\n\t * (a paste is trimmed to fit by the consumer's `onPaste`; anything that still\n\t * overflows is dropped). Content LOADED over the limit is preserved (initial\n\t * content isn't a transaction) and stays editable, but can only shrink — so the\n\t * user can never ADD past the cap, only trim down. Defaults to the soft\n\t * behaviour (typing blocked, paste allowed to overflow grey) for the CRM.\n\t */\n\thard?: boolean;\n}\n\n/**\n * Character limit with two flavours over the SAME metric (see CRM design):\n *\n * Soft (default):\n * 1. Typing is BLOCKED once the content is at/over the limit — `handleTextInput`\n * rejects the insertion. This never fires for paste (paste flows through the\n * clipboard pipeline), so paste is free to push the content over the limit.\n * 2. Every character BEYOND the limit is decorated with `bik-editor-overflow`\n * (rendered grey) so pasted overflow is visible but clearly marked.\n *\n * Hard (`hard: true`): additionally a `filterTransaction` rejects ANY transaction\n * that grows the count past the limit (paste, Enter, drop, IME — every path\n * `handleTextInput` misses), while still allowing shrink/no-growth edits so\n * already-over-limit loaded content stays editable. The grey decoration then only\n * ever marks that loaded overflow (a \"trim me\" hint), never freshly-added text.\n *\n * Counting mirrors `extractContent` exactly — `doc.textBetween(0, size, '\\n\\n',\n * '\\n')` — so the grey boundary AND the hard cap line up with the `characterCount`\n * the consumer shows (paragraph break = 2 chars, soft break = 1 char).\n */\nexport const CharacterLimitExtension = Extension.create<CharacterLimitOptions>({\n\tname: 'characterLimitOverflow',\n\n\taddOptions() {\n\t\treturn { limit: 0, hard: false };\n\t},\n\n\taddProseMirrorPlugins() {\n\t\tconst limit = this.options.limit;\n\t\tif (!limit || limit <= 0) return [];\n\t\tconst hard = this.options.hard;\n\n\t\t// Same metric as BikEditor.utils.extractContent → keeps the grey boundary\n\t\t// and the consumer's characterCount in sync.\n\t\tconst countChars = (doc: PMNode) =>\n\t\t\tdoc.textBetween(0, doc.content.size, '\\n\\n', '\\n').length;\n\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tkey: new PluginKey('characterLimitOverflow'),\n\t\t\t\t// Hard cap. Initial content is loaded at editor creation (not a\n\t\t\t\t// transaction), so it is never filtered here — content loaded over the\n\t\t\t\t// limit is preserved.\n\t\t\t\t...(hard\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfilterTransaction(tr, state) {\n\t\t\t\t\t\t\t\tif (!tr.docChanged) return true;\n\t\t\t\t\t\t\t\tconst next = countChars(tr.doc);\n\t\t\t\t\t\t\t\tif (next <= limit) return true;\n\t\t\t\t\t\t\t\tconst prev = countChars(state.doc);\n\t\t\t\t\t\t\t\t// Shrinking / no net growth always passes, so content already\n\t\t\t\t\t\t\t\t// over the limit can be trimmed DOWN (never up).\n\t\t\t\t\t\t\t\tif (next <= prev) return true;\n\t\t\t\t\t\t\t\t// Already over → block any growth outright; never delete the\n\t\t\t\t\t\t\t\t// user's existing over-limit content to make room.\n\t\t\t\t\t\t\t\tif (prev > limit) return false;\n\t\t\t\t\t\t\t\t// A single edit crossed under→over — a paste. Keep the part that\n\t\t\t\t\t\t\t\t// fits and drop the excess tail (paste truncates to the cap)\n\t\t\t\t\t\t\t\t// instead of rejecting the whole paste. Deleting `over` POSITIONS\n\t\t\t\t\t\t\t\t// ending at the caret removes >= `over` characters (a block break\n\t\t\t\t\t\t\t\t// is 2 chars but 1 position), so the result lands <= limit; the\n\t\t\t\t\t\t\t\t// re-check blocks the rare case it somehow didn't.\n\t\t\t\t\t\t\t\tconst over = next - limit;\n\t\t\t\t\t\t\t\tconst head = tr.selection.$head.pos;\n\t\t\t\t\t\t\t\tconst from = head - over;\n\t\t\t\t\t\t\t\tif (from <= 0) return false;\n\t\t\t\t\t\t\t\ttr.delete(from, head);\n\t\t\t\t\t\t\t\treturn countChars(tr.doc) <= limit;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t }\n\t\t\t\t\t: {}),\n\t\t\t\tprops: {\n\t\t\t\t\t// Block typed/composed input that would exceed the limit. Replacing\n\t\t\t\t\t// a selection is allowed as long as the result still fits.\n\t\t\t\t\thandleTextInput(view, from, to, text) {\n\t\t\t\t\t\tconst doc = view.state.doc;\n\t\t\t\t\t\tconst current = countChars(doc);\n\t\t\t\t\t\tconst removed = doc.textBetween(from, to, '\\n\\n', '\\n').length;\n\t\t\t\t\t\treturn current - removed + text.length > limit;\n\t\t\t\t\t},\n\t\t\t\t\tdecorations(state) {\n\t\t\t\t\t\tconst decorations: Decoration[] = [];\n\t\t\t\t\t\tlet count = 0;\n\t\t\t\t\t\tlet overflowing = false;\n\n\t\t\t\t\t\tstate.doc.descendants((node, pos, parent, index) => {\n\t\t\t\t\t\t\t// Account for the \"\\n\\n\" separator inserted between top-level\n\t\t\t\t\t\t\t// blocks so the boundary matches textBetween's counting.\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!overflowing &&\n\t\t\t\t\t\t\t\tparent &&\n\t\t\t\t\t\t\t\tparent.type.name === 'doc' &&\n\t\t\t\t\t\t\t\tindex > 0\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcount += 2;\n\t\t\t\t\t\t\t\tif (count > limit) overflowing = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (node.isText && node.text) {\n\t\t\t\t\t\t\t\tconst len = node.text.length;\n\t\t\t\t\t\t\t\tif (overflowing) {\n\t\t\t\t\t\t\t\t\tdecorations.push(\n\t\t\t\t\t\t\t\t\t\tDecoration.inline(pos, pos + len, {\n\t\t\t\t\t\t\t\t\t\t\tclass: 'bik-editor-overflow',\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else if (count + len > limit) {\n\t\t\t\t\t\t\t\t\tconst startOffset = Math.max(0, limit - count);\n\t\t\t\t\t\t\t\t\tdecorations.push(\n\t\t\t\t\t\t\t\t\t\tDecoration.inline(pos + startOffset, pos + len, {\n\t\t\t\t\t\t\t\t\t\t\tclass: 'bik-editor-overflow',\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\toverflowing = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcount += len;\n\t\t\t\t\t\t\t} else if (node.type.name === 'hardBreak') {\n\t\t\t\t\t\t\t\t// Soft line break → \"\\n\" (1 char) in textBetween.\n\t\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t\t\tif (!overflowing && count > limit) overflowing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn DecorationSet.create(state.doc, decorations);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\t},\n});\n"],"names":["CharacterLimitExtension","Extension","limit","hard","countChars","doc","Plugin","PluginKey","tr","state","next","prev","over","head","from","view","to","text","current","removed","decorations","count","overflowing","node","pos","parent","index","len","Decoration","startOffset","DecorationSet"],"mappings":";;;AAwCO,MAAMA,IAA0BC,EAAU,OAA8B;AAAA,EAC9E,MAAM;AAAA,EAEN,aAAa;AACZ,WAAO,EAAE,OAAO,GAAG,MAAM,GAAA;AAAA,EAC1B;AAAA,EAEA,wBAAwB;AACvB,UAAMC,IAAQ,KAAK,QAAQ;AAC3B,QAAI,CAACA,KAASA,KAAS,UAAU,CAAA;AACjC,UAAMC,IAAO,KAAK,QAAQ,MAIpBC,IAAa,CAACC,MACnBA,EAAI,YAAY,GAAGA,EAAI,QAAQ,MAAM;AAAA;AAAA,GAAQ;AAAA,CAAI,EAAE;AAEpD,WAAO;AAAA,MACN,IAAIC,EAAO;AAAA,QACV,KAAK,IAAIC,EAAU,wBAAwB;AAAA;AAAA;AAAA;AAAA,QAI3C,GAAIJ,IACD;AAAA,UACA,kBAAkBK,GAAIC,GAAO;AAC5B,gBAAI,CAACD,EAAG,WAAY,QAAO;AAC3B,kBAAME,IAAON,EAAWI,EAAG,GAAG;AAC9B,gBAAIE,KAAQR,EAAO,QAAO;AAC1B,kBAAMS,IAAOP,EAAWK,EAAM,GAAG;AAGjC,gBAAIC,KAAQC,EAAM,QAAO;AAGzB,gBAAIA,IAAOT,EAAO,QAAO;AAOzB,kBAAMU,IAAOF,IAAOR,GACdW,IAAOL,EAAG,UAAU,MAAM,KAC1BM,IAAOD,IAAOD;AACpB,mBAAIE,KAAQ,IAAU,MACtBN,EAAG,OAAOM,GAAMD,CAAI,GACbT,EAAWI,EAAG,GAAG,KAAKN;AAAA,UAC9B;AAAA,QAAA,IAEA,CAAA;AAAA,QACH,OAAO;AAAA;AAAA;AAAA,UAGN,gBAAgBa,GAAMD,GAAME,GAAIC,GAAM;AACrC,kBAAMZ,IAAMU,EAAK,MAAM,KACjBG,IAAUd,EAAWC,CAAG,GACxBc,IAAUd,EAAI,YAAYS,GAAME,GAAI;AAAA;AAAA,GAAQ;AAAA,CAAI,EAAE;AACxD,mBAAOE,IAAUC,IAAUF,EAAK,SAASf;AAAA,UAC1C;AAAA,UACA,YAAYO,GAAO;AAClB,kBAAMW,IAA4B,CAAA;AAClC,gBAAIC,IAAQ,GACRC,IAAc;AAElB,mBAAAb,EAAM,IAAI,YAAY,CAACc,GAAMC,GAAKC,GAAQC,MAAU;AAanD,kBATC,CAACJ,KACDG,KACAA,EAAO,KAAK,SAAS,SACrBC,IAAQ,MAERL,KAAS,GACLA,IAAQnB,MAAOoB,IAAc,MAG9BC,EAAK,UAAUA,EAAK,MAAM;AAC7B,sBAAMI,IAAMJ,EAAK,KAAK;AACtB,oBAAID;AACH,kBAAAF,EAAY;AAAA,oBACXQ,EAAW,OAAOJ,GAAKA,IAAMG,GAAK;AAAA,sBACjC,OAAO;AAAA,oBAAA,CACP;AAAA,kBAAA;AAAA,yBAEQN,IAAQM,IAAMzB,GAAO;AAC/B,wBAAM2B,IAAc,KAAK,IAAI,GAAG3B,IAAQmB,CAAK;AAC7C,kBAAAD,EAAY;AAAA,oBACXQ,EAAW,OAAOJ,IAAMK,GAAaL,IAAMG,GAAK;AAAA,sBAC/C,OAAO;AAAA,oBAAA,CACP;AAAA,kBAAA,GAEFL,IAAc;AAAA,gBACf;AACA,gBAAAD,KAASM;AAAA,cACV,MAAA,CAAWJ,EAAK,KAAK,SAAS,gBAE7BF,KAAS,GACL,CAACC,KAAeD,IAAQnB,MAAOoB,IAAc;AAElD,qBAAO;AAAA,YACR,CAAC,GAEMQ,EAAc,OAAOrB,EAAM,KAAKW,CAAW;AAAA,UACnD;AAAA,QAAA;AAAA,MACD,CACA;AAAA,IAAA;AAAA,EAEH;AACD,CAAC;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NodeViewProps } from '@tiptap/react';
|
|
2
|
+
import { default as React } from 'react';
|
|
3
|
+
export interface MentionChipConfig {
|
|
4
|
+
/** CSS class(es) applied to the chip wrapper (e.g. `bik-mention bik-mention--agent`). */
|
|
5
|
+
cssClass: string;
|
|
6
|
+
/** Trigger char, prepended to the label for legacy (kind-less) chips. */
|
|
7
|
+
char: '@' | '#';
|
|
8
|
+
/** Leading glyph for the chip (e.g. a tool's source icon). Omit → no icon. */
|
|
9
|
+
renderChipIcon?: (source: string | null, kind: string | null) => React.ReactNode;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* React node view for a mention chip so we can render a leading icon (e.g. a
|
|
13
|
+
* tool's source glyph) before the label. Only used when a `renderChipIcon` is
|
|
14
|
+
* supplied; otherwise the extension keeps its plain `renderHTML` chip. The chip
|
|
15
|
+
* stays atomic/non-editable — serialization still runs off the node attrs.
|
|
16
|
+
*/
|
|
17
|
+
export declare const buildMentionChipNodeView: (config: MentionChipConfig) => React.FC<NodeViewProps>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsxs as r, jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { NodeViewWrapper as c } from "@tiptap/react";
|
|
3
|
+
const m = (e) => {
|
|
4
|
+
const t = ({ node: n }) => {
|
|
5
|
+
const i = n.attrs.kind ?? null, s = n.attrs.source ?? null, a = n.attrs.label ?? "", l = e.renderChipIcon?.(s, i);
|
|
6
|
+
return /* @__PURE__ */ r(
|
|
7
|
+
c,
|
|
8
|
+
{
|
|
9
|
+
as: "span",
|
|
10
|
+
className: e.cssClass,
|
|
11
|
+
"data-kind": i ?? void 0,
|
|
12
|
+
"data-source": s ?? void 0,
|
|
13
|
+
contentEditable: !1,
|
|
14
|
+
children: [
|
|
15
|
+
l ? /* @__PURE__ */ o(
|
|
16
|
+
"span",
|
|
17
|
+
{
|
|
18
|
+
className: "bik-mention-icon",
|
|
19
|
+
contentEditable: !1,
|
|
20
|
+
style: {
|
|
21
|
+
display: "inline-flex",
|
|
22
|
+
alignItems: "center",
|
|
23
|
+
verticalAlign: "middle",
|
|
24
|
+
marginRight: 4
|
|
25
|
+
},
|
|
26
|
+
children: l
|
|
27
|
+
}
|
|
28
|
+
) : null,
|
|
29
|
+
i ? a : `${e.char}${a}`
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
return t.displayName = "MentionChipNodeView", t;
|
|
35
|
+
};
|
|
36
|
+
export {
|
|
37
|
+
m as buildMentionChipNodeView
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=MentionChipNodeView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MentionChipNodeView.js","sources":["../../../../../src/editor/extensions/mention/MentionChipNodeView.tsx"],"sourcesContent":["import { type NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport React from 'react';\n\nexport interface MentionChipConfig {\n\t/** CSS class(es) applied to the chip wrapper (e.g. `bik-mention bik-mention--agent`). */\n\tcssClass: string;\n\t/** Trigger char, prepended to the label for legacy (kind-less) chips. */\n\tchar: '@' | '#';\n\t/** Leading glyph for the chip (e.g. a tool's source icon). Omit → no icon. */\n\trenderChipIcon?: (\n\t\tsource: string | null,\n\t\tkind: string | null,\n\t) => React.ReactNode;\n}\n\n/**\n * React node view for a mention chip so we can render a leading icon (e.g. a\n * tool's source glyph) before the label. Only used when a `renderChipIcon` is\n * supplied; otherwise the extension keeps its plain `renderHTML` chip. The chip\n * stays atomic/non-editable — serialization still runs off the node attrs.\n */\nexport const buildMentionChipNodeView = (\n\tconfig: MentionChipConfig,\n): React.FC<NodeViewProps> => {\n\tconst Chip: React.FC<NodeViewProps> = ({ node }) => {\n\t\tconst kind = (node.attrs['kind'] as string | null) ?? null;\n\t\tconst source = (node.attrs['source'] as string | null) ?? null;\n\t\tconst label = (node.attrs['label'] as string) ?? '';\n\t\tconst icon = config.renderChipIcon?.(source, kind);\n\t\treturn (\n\t\t\t<NodeViewWrapper\n\t\t\t\tas=\"span\"\n\t\t\t\tclassName={config.cssClass}\n\t\t\t\tdata-kind={kind ?? undefined}\n\t\t\t\tdata-source={source ?? undefined}\n\t\t\t\tcontentEditable={false}\n\t\t\t>\n\t\t\t\t{icon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"bik-mention-icon\"\n\t\t\t\t\t\tcontentEditable={false}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'inline-flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\t\t\tmarginRight: 4,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t{kind ? label : `${config.char}${label}`}\n\t\t\t</NodeViewWrapper>\n\t\t);\n\t};\n\tChip.displayName = 'MentionChipNodeView';\n\treturn Chip;\n};\n"],"names":["buildMentionChipNodeView","config","Chip","node","kind","source","label","icon","jsxs","NodeViewWrapper","jsx"],"mappings":";;AAqBO,MAAMA,IAA2B,CACvCC,MAC6B;AAC7B,QAAMC,IAAgC,CAAC,EAAE,MAAAC,QAAW;AACnD,UAAMC,IAAQD,EAAK,MAAM,QAA6B,MAChDE,IAAUF,EAAK,MAAM,UAA+B,MACpDG,IAASH,EAAK,MAAM,SAAuB,IAC3CI,IAAON,EAAO,iBAAiBI,GAAQD,CAAI;AACjD,WACC,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACA,IAAG;AAAA,QACH,WAAWR,EAAO;AAAA,QAClB,aAAWG,KAAQ;AAAA,QACnB,eAAaC,KAAU;AAAA,QACvB,iBAAiB;AAAA,QAEhB,UAAA;AAAA,UAAAE,IACA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,WAAU;AAAA,cACV,iBAAiB;AAAA,cACjB,OAAO;AAAA,gBACN,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,aAAa;AAAA,cAAA;AAAA,cAGb,UAAAH;AAAA,YAAA;AAAA,UAAA,IAEC;AAAA,UACHH,IAAOE,IAAQ,GAAGL,EAAO,IAAI,GAAGK,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGzC;AACA,SAAAJ,EAAK,cAAc,uBACZA;AACR;"}
|
|
@@ -2,7 +2,7 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { MentionDropdownRenderProps, MentionItem } from '../../BikEditor.types';
|
|
3
3
|
export declare function buildAgentMentionExtension(agentsRef: {
|
|
4
4
|
current: MentionItem[];
|
|
5
|
-
}, onSelect?: (item: MentionItem, char: '@' | '#') => void, renderItem?: (item: MentionItem, isActive: boolean) => ReactNode, renderDropdown?: (props: MentionDropdownRenderProps) => ReactNode, removeTriggerOnDismiss?: boolean): import('@tiptap/core').Node<import('@tiptap/extension-mention').MentionOptions<any, import('@tiptap/extension-mention').MentionNodeAttrs>, any>;
|
|
5
|
+
}, onSelect?: (item: MentionItem, char: '@' | '#') => void, renderItem?: (item: MentionItem, isActive: boolean) => ReactNode, renderDropdown?: (props: MentionDropdownRenderProps) => ReactNode, removeTriggerOnDismiss?: boolean, renderChipIcon?: (source: string | null, kind: string | null) => ReactNode): import('@tiptap/core').Node<import('@tiptap/extension-mention').MentionOptions<any, import('@tiptap/extension-mention').MentionNodeAttrs>, any>;
|
|
6
6
|
export declare function buildTeamMentionExtension(teamsRef: {
|
|
7
7
|
current: MentionItem[];
|
|
8
8
|
}, onSelect?: (item: MentionItem, char: '@' | '#') => void, renderItem?: (item: MentionItem, isActive: boolean) => ReactNode, renderDropdown?: (props: MentionDropdownRenderProps) => ReactNode, removeTriggerOnDismiss?: boolean): import('@tiptap/core').Node<import('@tiptap/extension-mention').MentionOptions<any, import('@tiptap/extension-mention').MentionNodeAttrs>, any>;
|
|
@@ -1,56 +1,57 @@
|
|
|
1
1
|
import { mergeAttributes as f } from "../../../node_modules/@tiptap/core/dist/index.js";
|
|
2
2
|
import k from "@tiptap/extension-mention";
|
|
3
|
-
import {
|
|
4
|
-
import { createSuggestionPopup as
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { ReactNodeViewRenderer as b, ReactRenderer as w } from "@tiptap/react";
|
|
4
|
+
import { createSuggestionPopup as h } from "../suggestionPopup.js";
|
|
5
|
+
import { buildMentionChipNodeView as p } from "./MentionChipNodeView.js";
|
|
6
|
+
import { MentionDropdown as M } from "./MentionDropdown.js";
|
|
7
|
+
function T(u, r) {
|
|
8
|
+
const { renderItem: d, renderDropdown: a, removeTriggerOnDismiss: c } = u;
|
|
8
9
|
return () => {
|
|
9
|
-
let
|
|
10
|
-
const
|
|
10
|
+
let i, o, e, t = null;
|
|
11
|
+
const s = () => {
|
|
11
12
|
if (r.picked = !0, e?.editor && e?.range) {
|
|
12
|
-
const { editor: n, range:
|
|
13
|
-
n.chain().focus().deleteRange(
|
|
13
|
+
const { editor: n, range: l } = e;
|
|
14
|
+
n.chain().focus().deleteRange(l).run();
|
|
14
15
|
}
|
|
15
16
|
};
|
|
16
17
|
return {
|
|
17
18
|
onStart: (n) => {
|
|
18
|
-
e = n, r.picked = !1,
|
|
19
|
-
props: { ...n, renderItem:
|
|
19
|
+
e = n, r.picked = !1, i = new w(M, {
|
|
20
|
+
props: { ...n, renderItem: d, renderDropdown: a, dismiss: s },
|
|
20
21
|
editor: n.editor
|
|
21
|
-
}),
|
|
22
|
-
const m =
|
|
23
|
-
!m ||
|
|
22
|
+
}), o = h(i.element, n.clientRect), t = (l) => {
|
|
23
|
+
const m = l.target;
|
|
24
|
+
!m || o.element.contains(m) || e?.editor?.view?.dom?.contains(m) || (r.picked = !0, e?.editor && e?.range && e.editor.chain().deleteRange(e.range).run(), o.hide());
|
|
24
25
|
}, document.addEventListener("mousedown", t);
|
|
25
26
|
},
|
|
26
27
|
onUpdate: (n) => {
|
|
27
|
-
if (e = n,
|
|
28
|
+
if (e = n, i.updateProps({
|
|
28
29
|
...n,
|
|
29
|
-
renderItem:
|
|
30
|
+
renderItem: d,
|
|
30
31
|
renderDropdown: a,
|
|
31
|
-
dismiss:
|
|
32
|
+
dismiss: s
|
|
32
33
|
}), !n.items?.length) {
|
|
33
|
-
|
|
34
|
+
o.hide();
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
+
o.show(), o.updatePosition(n.clientRect);
|
|
37
38
|
},
|
|
38
|
-
onKeyDown: (n) => n.event.key === "Escape" ? (
|
|
39
|
+
onKeyDown: (n) => n.event.key === "Escape" ? (o.hide(), !0) : i.ref?.onKeyDown(n) ?? !1,
|
|
39
40
|
onExit: () => {
|
|
40
|
-
if (t && (document.removeEventListener("mousedown", t), t = null),
|
|
41
|
-
const { editor: n, range:
|
|
41
|
+
if (t && (document.removeEventListener("mousedown", t), t = null), o.destroy(), i.destroy(), c && !r.picked && e?.editor && e?.range) {
|
|
42
|
+
const { editor: n, range: l } = e;
|
|
42
43
|
setTimeout(() => {
|
|
43
|
-
n.isDestroyed || n.chain().deleteRange(
|
|
44
|
+
n.isDestroyed || n.chain().deleteRange(l).run();
|
|
44
45
|
}, 0);
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
};
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
|
-
function g(
|
|
51
|
-
const
|
|
51
|
+
function g(u, r, d, a, c, i) {
|
|
52
|
+
const o = { picked: !1 };
|
|
52
53
|
return k.extend({
|
|
53
|
-
name:
|
|
54
|
+
name: u,
|
|
54
55
|
addAttributes() {
|
|
55
56
|
return {
|
|
56
57
|
...this.parent?.(),
|
|
@@ -58,9 +59,28 @@ function g(d, r, o, a, s, u) {
|
|
|
58
59
|
default: null,
|
|
59
60
|
parseHTML: (e) => e.getAttribute("data-kind"),
|
|
60
61
|
renderHTML: (e) => e.kind ? { "data-kind": String(e.kind) } : {}
|
|
62
|
+
},
|
|
63
|
+
// Tool source bucket (manifest / shopify / …); drives the chip icon.
|
|
64
|
+
source: {
|
|
65
|
+
default: null,
|
|
66
|
+
parseHTML: (e) => e.getAttribute("data-source"),
|
|
67
|
+
renderHTML: (e) => e.source ? { "data-source": String(e.source) } : {}
|
|
61
68
|
}
|
|
62
69
|
};
|
|
63
|
-
}
|
|
70
|
+
},
|
|
71
|
+
// A React chip (with the leading source icon) only when the consumer asks for
|
|
72
|
+
// it — otherwise the plain renderHTML chip is kept (unchanged for CRM etc.).
|
|
73
|
+
...i.renderChipIcon ? {
|
|
74
|
+
addNodeView() {
|
|
75
|
+
return b(
|
|
76
|
+
p({
|
|
77
|
+
cssClass: r,
|
|
78
|
+
char: d,
|
|
79
|
+
renderChipIcon: i.renderChipIcon
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
} : {}
|
|
64
84
|
}).configure({
|
|
65
85
|
HTMLAttributes: { class: r },
|
|
66
86
|
renderText: ({ options: e, node: t }) => `${t.attrs.kind ? "" : e.suggestion.char}${t.attrs.label}`,
|
|
@@ -68,52 +88,54 @@ function g(d, r, o, a, s, u) {
|
|
|
68
88
|
"span",
|
|
69
89
|
f(
|
|
70
90
|
e.HTMLAttributes,
|
|
71
|
-
t.attrs.kind ? { "data-kind": String(t.attrs.kind) } : {}
|
|
91
|
+
t.attrs.kind ? { "data-kind": String(t.attrs.kind) } : {},
|
|
92
|
+
t.attrs.source ? { "data-source": String(t.attrs.source) } : {}
|
|
72
93
|
),
|
|
73
94
|
`${t.attrs.kind ? "" : e.suggestion.char}${t.attrs.label}`
|
|
74
95
|
],
|
|
75
96
|
suggestion: {
|
|
76
|
-
char:
|
|
97
|
+
char: d,
|
|
77
98
|
allowSpaces: !0,
|
|
78
99
|
items: ({ query: e }) => a.current.filter(
|
|
79
100
|
(t) => t.label.toLowerCase().includes(e.toLowerCase())
|
|
80
101
|
),
|
|
81
|
-
command: ({ editor: e, range: t, props:
|
|
82
|
-
|
|
83
|
-
type:
|
|
102
|
+
command: ({ editor: e, range: t, props: s }) => {
|
|
103
|
+
o.picked = !0, e.chain().focus().deleteRange(t).insertContent({
|
|
104
|
+
type: u,
|
|
84
105
|
attrs: {
|
|
85
|
-
id:
|
|
86
|
-
label:
|
|
87
|
-
kind:
|
|
106
|
+
id: s.id,
|
|
107
|
+
label: s.label,
|
|
108
|
+
kind: s.meta?.kind ?? null,
|
|
109
|
+
source: s.meta?.source ?? null
|
|
88
110
|
}
|
|
89
|
-
}).run(),
|
|
111
|
+
}).run(), c?.(s, d);
|
|
90
112
|
},
|
|
91
|
-
render:
|
|
113
|
+
render: T(i, o)
|
|
92
114
|
}
|
|
93
115
|
});
|
|
94
116
|
}
|
|
95
|
-
function
|
|
117
|
+
function H(u, r, d, a, c, i) {
|
|
96
118
|
return g(
|
|
97
119
|
"mentionAgent",
|
|
98
120
|
"bik-mention bik-mention--agent",
|
|
99
121
|
"@",
|
|
100
|
-
|
|
122
|
+
u,
|
|
101
123
|
r,
|
|
102
|
-
{ renderItem:
|
|
124
|
+
{ renderItem: d, renderDropdown: a, removeTriggerOnDismiss: c, renderChipIcon: i }
|
|
103
125
|
);
|
|
104
126
|
}
|
|
105
|
-
function
|
|
127
|
+
function S(u, r, d, a, c) {
|
|
106
128
|
return g(
|
|
107
129
|
"mentionTeam",
|
|
108
130
|
"bik-mention bik-mention--team",
|
|
109
131
|
"#",
|
|
110
|
-
|
|
132
|
+
u,
|
|
111
133
|
r,
|
|
112
|
-
{ renderItem:
|
|
134
|
+
{ renderItem: d, renderDropdown: a, removeTriggerOnDismiss: c }
|
|
113
135
|
);
|
|
114
136
|
}
|
|
115
137
|
export {
|
|
116
|
-
|
|
117
|
-
|
|
138
|
+
H as buildAgentMentionExtension,
|
|
139
|
+
S as buildTeamMentionExtension
|
|
118
140
|
};
|
|
119
141
|
//# sourceMappingURL=MentionExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MentionExtension.js","sources":["../../../../../src/editor/extensions/mention/MentionExtension.ts"],"sourcesContent":["import { mergeAttributes } from '@tiptap/core';\nimport Mention from '@tiptap/extension-mention';\nimport { ReactRenderer } from '@tiptap/react';\nimport type { ReactNode } from 'react';\nimport type {\n\tMentionDropdownRenderProps,\n\tMentionItem,\n} from '../../BikEditor.types';\nimport {\n\tcreateSuggestionPopup,\n\ttype SuggestionPopup,\n} from '../suggestionPopup';\nimport { MentionDropdown } from './MentionDropdown';\n\ninterface MentionBuildOptions {\n\trenderItem?: (item: MentionItem, isActive: boolean) => ReactNode;\n\trenderDropdown?: (props: MentionDropdownRenderProps) => ReactNode;\n\t/** Remove the typed trigger char + query if the menu closes without a selection. */\n\tremoveTriggerOnDismiss?: boolean;\n}\n\nfunction buildRender(\n\toptions: MentionBuildOptions,\n\tpickedRef: { picked: boolean },\n) {\n\tconst { renderItem, renderDropdown, removeTriggerOnDismiss } = options;\n\treturn () => {\n\t\tlet component: ReactRenderer;\n\t\tlet popup: SuggestionPopup;\n\t\tlet latestProps: any;\n\t\t// Closes the menu when the user clicks anywhere outside it. The `@` popup\n\t\t// lives on document.body (not inside the editor), so nothing dismisses it on\n\t\t// an outside click otherwise — only Escape / moving the cursor did.\n\t\tlet onDocMouseDown: ((event: MouseEvent) => void) | null = null;\n\n\t\t// Close the menu without a selection: drop the typed \"@query\" so no orphan\n\t\t// trigger is left, and mark as picked so onExit doesn't delete it twice.\n\t\tconst dismiss = () => {\n\t\t\tpickedRef.picked = true;\n\t\t\tif (latestProps?.editor && latestProps?.range) {\n\t\t\t\tconst { editor, range } = latestProps;\n\t\t\t\teditor.chain().focus().deleteRange(range).run();\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\tonStart: (props: any) => {\n\t\t\t\tlatestProps = props;\n\t\t\t\tpickedRef.picked = false;\n\t\t\t\tcomponent = new ReactRenderer(MentionDropdown, {\n\t\t\t\t\tprops: { ...props, renderItem, renderDropdown, dismiss },\n\t\t\t\t\teditor: props.editor,\n\t\t\t\t});\n\t\t\t\tpopup = createSuggestionPopup(component.element, props.clientRect);\n\t\t\t\tonDocMouseDown = (event: MouseEvent) => {\n\t\t\t\t\tconst target = event.target as Node | null;\n\t\t\t\t\tif (!target) return;\n\t\t\t\t\t// Inside the picker → keep open (row clicks fire on `click`).\n\t\t\t\t\tif (popup.element.contains(target)) return;\n\t\t\t\t\t// Inside the editor → the suggestion plugin already closes it.\n\t\t\t\t\tconst editorDom = latestProps?.editor?.view?.dom as\n\t\t\t\t\t\t| HTMLElement\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (editorDom?.contains(target)) return;\n\t\t\t\t\t// Anywhere else → drop the typed \"@query\" (no refocus — clicking\n\t\t\t\t\t// away shouldn't yank focus back) and close.\n\t\t\t\t\tpickedRef.picked = true;\n\t\t\t\t\tif (latestProps?.editor && latestProps?.range) {\n\t\t\t\t\t\tlatestProps.editor.chain().deleteRange(latestProps.range).run();\n\t\t\t\t\t}\n\t\t\t\t\tpopup.hide();\n\t\t\t\t};\n\t\t\t\tdocument.addEventListener('mousedown', onDocMouseDown);\n\t\t\t},\n\t\t\tonUpdate: (props: any) => {\n\t\t\t\tlatestProps = props;\n\t\t\t\tcomponent.updateProps({\n\t\t\t\t\t...props,\n\t\t\t\t\trenderItem,\n\t\t\t\t\trenderDropdown,\n\t\t\t\t\tdismiss,\n\t\t\t\t});\n\t\t\t\tif (!props.items?.length) {\n\t\t\t\t\tpopup.hide();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpopup.show();\n\t\t\t\tpopup.updatePosition(props.clientRect);\n\t\t\t},\n\t\t\tonKeyDown: (props: any) => {\n\t\t\t\tif (props.event.key === 'Escape') {\n\t\t\t\t\tpopup.hide();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn (component.ref as any)?.onKeyDown(props) ?? false;\n\t\t\t},\n\t\t\tonExit: () => {\n\t\t\t\tif (onDocMouseDown) {\n\t\t\t\t\tdocument.removeEventListener('mousedown', onDocMouseDown);\n\t\t\t\t\tonDocMouseDown = null;\n\t\t\t\t}\n\t\t\t\tpopup.destroy();\n\t\t\t\tcomponent.destroy();\n\t\t\t\t// Nothing was picked → strip the orphan \"@query\" the user typed.\n\t\t\t\tif (\n\t\t\t\t\tremoveTriggerOnDismiss &&\n\t\t\t\t\t!pickedRef.picked &&\n\t\t\t\t\tlatestProps?.editor &&\n\t\t\t\t\tlatestProps?.range\n\t\t\t\t) {\n\t\t\t\t\tconst { editor, range } = latestProps;\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (!editor.isDestroyed) {\n\t\t\t\t\t\t\teditor.chain().deleteRange(range).run();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n}\n\n/**\n * Builds a TipTap Mention extension.\n *\n * Each inserted node carries an optional `kind` attribute. When set, the chip is\n * rendered WITHOUT the trigger char (the `label` already encodes the full text)\n * and a `data-kind` attribute is emitted so CSS can colour it per kind. When\n * `kind` is null the legacy `${char}${label}` chip is rendered (back-compatible).\n */\nfunction buildMentionExtension(\n\tname: 'mentionAgent' | 'mentionTeam',\n\tcssClass: string,\n\tchar: '@' | '#',\n\titemsRef: { current: MentionItem[] },\n\tonSelect: ((item: MentionItem, char: '@' | '#') => void) | undefined,\n\toptions: MentionBuildOptions,\n) {\n\tconst pickedRef = { picked: false };\n\n\treturn Mention.extend({\n\t\tname,\n\t\taddAttributes() {\n\t\t\treturn {\n\t\t\t\t...this.parent?.(),\n\t\t\t\tkind: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\tparseHTML: (el: HTMLElement) => el.getAttribute('data-kind'),\n\t\t\t\t\trenderHTML: (attrs: Record<string, unknown>) =>\n\t\t\t\t\t\tattrs['kind'] ? { 'data-kind': String(attrs['kind']) } : {},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t}).configure({\n\t\tHTMLAttributes: { class: cssClass },\n\t\trenderText: ({ options: opt, node }: any) =>\n\t\t\t`${node.attrs['kind'] ? '' : opt.suggestion.char}${node.attrs['label']}`,\n\t\trenderHTML: ({ options: opt, node }: any) => [\n\t\t\t'span',\n\t\t\tmergeAttributes(\n\t\t\t\topt.HTMLAttributes,\n\t\t\t\tnode.attrs['kind'] ? { 'data-kind': String(node.attrs['kind']) } : {},\n\t\t\t),\n\t\t\t`${node.attrs['kind'] ? '' : opt.suggestion.char}${node.attrs['label']}`,\n\t\t],\n\t\tsuggestion: {\n\t\t\tchar,\n\t\t\tallowSpaces: true,\n\t\t\titems: ({ query }: { query: string }) =>\n\t\t\t\titemsRef.current.filter((a) =>\n\t\t\t\t\ta.label.toLowerCase().includes(query.toLowerCase()),\n\t\t\t\t),\n\t\t\tcommand: ({ editor, range, props }: any) => {\n\t\t\t\tpickedRef.picked = true;\n\t\t\t\teditor\n\t\t\t\t\t.chain()\n\t\t\t\t\t.focus()\n\t\t\t\t\t.deleteRange(range)\n\t\t\t\t\t.insertContent({\n\t\t\t\t\t\ttype: name,\n\t\t\t\t\t\tattrs: {\n\t\t\t\t\t\t\tid: props.id,\n\t\t\t\t\t\t\tlabel: props.label,\n\t\t\t\t\t\t\tkind: props.meta?.kind ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.run();\n\t\t\t\tonSelect?.(props, char);\n\t\t\t},\n\t\t\trender: buildRender(options, pickedRef),\n\t\t},\n\t});\n}\n\nexport function buildAgentMentionExtension(\n\tagentsRef: { current: MentionItem[] },\n\tonSelect?: (item: MentionItem, char: '@' | '#') => void,\n\trenderItem?: (item: MentionItem, isActive: boolean) => ReactNode,\n\trenderDropdown?: (props: MentionDropdownRenderProps) => ReactNode,\n\tremoveTriggerOnDismiss?: boolean,\n) {\n\treturn buildMentionExtension(\n\t\t'mentionAgent',\n\t\t'bik-mention bik-mention--agent',\n\t\t'@',\n\t\tagentsRef,\n\t\tonSelect,\n\t\t{ renderItem, renderDropdown, removeTriggerOnDismiss },\n\t);\n}\n\nexport function buildTeamMentionExtension(\n\tteamsRef: { current: MentionItem[] },\n\tonSelect?: (item: MentionItem, char: '@' | '#') => void,\n\trenderItem?: (item: MentionItem, isActive: boolean) => ReactNode,\n\trenderDropdown?: (props: MentionDropdownRenderProps) => ReactNode,\n\tremoveTriggerOnDismiss?: boolean,\n) {\n\treturn buildMentionExtension(\n\t\t'mentionTeam',\n\t\t'bik-mention bik-mention--team',\n\t\t'#',\n\t\tteamsRef,\n\t\tonSelect,\n\t\t{ renderItem, renderDropdown, removeTriggerOnDismiss },\n\t);\n}\n"],"names":["buildRender","options","pickedRef","renderItem","renderDropdown","removeTriggerOnDismiss","component","popup","latestProps","onDocMouseDown","dismiss","editor","range","props","ReactRenderer","MentionDropdown","createSuggestionPopup","event","target","buildMentionExtension","name","cssClass","char","itemsRef","onSelect","Mention","el","attrs","opt","node","mergeAttributes","query","a","buildAgentMentionExtension","agentsRef","buildTeamMentionExtension","teamsRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MentionExtension.js","sources":["../../../../../src/editor/extensions/mention/MentionExtension.ts"],"sourcesContent":["import { mergeAttributes } from '@tiptap/core';\nimport Mention from '@tiptap/extension-mention';\nimport { ReactNodeViewRenderer, ReactRenderer } from '@tiptap/react';\nimport type { ReactNode } from 'react';\nimport type {\n\tMentionDropdownRenderProps,\n\tMentionItem,\n} from '../../BikEditor.types';\nimport {\n\tcreateSuggestionPopup,\n\ttype SuggestionPopup,\n} from '../suggestionPopup';\nimport { buildMentionChipNodeView } from './MentionChipNodeView';\nimport { MentionDropdown } from './MentionDropdown';\n\ninterface MentionBuildOptions {\n\trenderItem?: (item: MentionItem, isActive: boolean) => ReactNode;\n\trenderDropdown?: (props: MentionDropdownRenderProps) => ReactNode;\n\t/** Remove the typed trigger char + query if the menu closes without a selection. */\n\tremoveTriggerOnDismiss?: boolean;\n\t/**\n\t * Leading glyph rendered inside the chip (e.g. a tool's source icon). Supplying\n\t * it switches the chip to a React node view; omit to keep the plain chip.\n\t */\n\trenderChipIcon?: (source: string | null, kind: string | null) => ReactNode;\n}\n\nfunction buildRender(\n\toptions: MentionBuildOptions,\n\tpickedRef: { picked: boolean },\n) {\n\tconst { renderItem, renderDropdown, removeTriggerOnDismiss } = options;\n\treturn () => {\n\t\tlet component: ReactRenderer;\n\t\tlet popup: SuggestionPopup;\n\t\tlet latestProps: any;\n\t\t// Closes the menu when the user clicks anywhere outside it. The `@` popup\n\t\t// lives on document.body (not inside the editor), so nothing dismisses it on\n\t\t// an outside click otherwise — only Escape / moving the cursor did.\n\t\tlet onDocMouseDown: ((event: MouseEvent) => void) | null = null;\n\n\t\t// Close the menu without a selection: drop the typed \"@query\" so no orphan\n\t\t// trigger is left, and mark as picked so onExit doesn't delete it twice.\n\t\tconst dismiss = () => {\n\t\t\tpickedRef.picked = true;\n\t\t\tif (latestProps?.editor && latestProps?.range) {\n\t\t\t\tconst { editor, range } = latestProps;\n\t\t\t\teditor.chain().focus().deleteRange(range).run();\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\tonStart: (props: any) => {\n\t\t\t\tlatestProps = props;\n\t\t\t\tpickedRef.picked = false;\n\t\t\t\tcomponent = new ReactRenderer(MentionDropdown, {\n\t\t\t\t\tprops: { ...props, renderItem, renderDropdown, dismiss },\n\t\t\t\t\teditor: props.editor,\n\t\t\t\t});\n\t\t\t\tpopup = createSuggestionPopup(component.element, props.clientRect);\n\t\t\t\tonDocMouseDown = (event: MouseEvent) => {\n\t\t\t\t\tconst target = event.target as Node | null;\n\t\t\t\t\tif (!target) return;\n\t\t\t\t\t// Inside the picker → keep open (row clicks fire on `click`).\n\t\t\t\t\tif (popup.element.contains(target)) return;\n\t\t\t\t\t// Inside the editor → the suggestion plugin already closes it.\n\t\t\t\t\tconst editorDom = latestProps?.editor?.view?.dom as\n\t\t\t\t\t\t| HTMLElement\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (editorDom?.contains(target)) return;\n\t\t\t\t\t// Anywhere else → drop the typed \"@query\" (no refocus — clicking\n\t\t\t\t\t// away shouldn't yank focus back) and close.\n\t\t\t\t\tpickedRef.picked = true;\n\t\t\t\t\tif (latestProps?.editor && latestProps?.range) {\n\t\t\t\t\t\tlatestProps.editor.chain().deleteRange(latestProps.range).run();\n\t\t\t\t\t}\n\t\t\t\t\tpopup.hide();\n\t\t\t\t};\n\t\t\t\tdocument.addEventListener('mousedown', onDocMouseDown);\n\t\t\t},\n\t\t\tonUpdate: (props: any) => {\n\t\t\t\tlatestProps = props;\n\t\t\t\tcomponent.updateProps({\n\t\t\t\t\t...props,\n\t\t\t\t\trenderItem,\n\t\t\t\t\trenderDropdown,\n\t\t\t\t\tdismiss,\n\t\t\t\t});\n\t\t\t\tif (!props.items?.length) {\n\t\t\t\t\tpopup.hide();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpopup.show();\n\t\t\t\tpopup.updatePosition(props.clientRect);\n\t\t\t},\n\t\t\tonKeyDown: (props: any) => {\n\t\t\t\tif (props.event.key === 'Escape') {\n\t\t\t\t\tpopup.hide();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn (component.ref as any)?.onKeyDown(props) ?? false;\n\t\t\t},\n\t\t\tonExit: () => {\n\t\t\t\tif (onDocMouseDown) {\n\t\t\t\t\tdocument.removeEventListener('mousedown', onDocMouseDown);\n\t\t\t\t\tonDocMouseDown = null;\n\t\t\t\t}\n\t\t\t\tpopup.destroy();\n\t\t\t\tcomponent.destroy();\n\t\t\t\t// Nothing was picked → strip the orphan \"@query\" the user typed.\n\t\t\t\tif (\n\t\t\t\t\tremoveTriggerOnDismiss &&\n\t\t\t\t\t!pickedRef.picked &&\n\t\t\t\t\tlatestProps?.editor &&\n\t\t\t\t\tlatestProps?.range\n\t\t\t\t) {\n\t\t\t\t\tconst { editor, range } = latestProps;\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (!editor.isDestroyed) {\n\t\t\t\t\t\t\teditor.chain().deleteRange(range).run();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n}\n\n/**\n * Builds a TipTap Mention extension.\n *\n * Each inserted node carries an optional `kind` attribute. When set, the chip is\n * rendered WITHOUT the trigger char (the `label` already encodes the full text)\n * and a `data-kind` attribute is emitted so CSS can colour it per kind. When\n * `kind` is null the legacy `${char}${label}` chip is rendered (back-compatible).\n */\nfunction buildMentionExtension(\n\tname: 'mentionAgent' | 'mentionTeam',\n\tcssClass: string,\n\tchar: '@' | '#',\n\titemsRef: { current: MentionItem[] },\n\tonSelect: ((item: MentionItem, char: '@' | '#') => void) | undefined,\n\toptions: MentionBuildOptions,\n) {\n\tconst pickedRef = { picked: false };\n\n\treturn Mention.extend({\n\t\tname,\n\t\taddAttributes() {\n\t\t\treturn {\n\t\t\t\t...this.parent?.(),\n\t\t\t\tkind: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\tparseHTML: (el: HTMLElement) => el.getAttribute('data-kind'),\n\t\t\t\t\trenderHTML: (attrs: Record<string, unknown>) =>\n\t\t\t\t\t\tattrs['kind'] ? { 'data-kind': String(attrs['kind']) } : {},\n\t\t\t\t},\n\t\t\t\t// Tool source bucket (manifest / shopify / …); drives the chip icon.\n\t\t\t\tsource: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\tparseHTML: (el: HTMLElement) => el.getAttribute('data-source'),\n\t\t\t\t\trenderHTML: (attrs: Record<string, unknown>) =>\n\t\t\t\t\t\tattrs['source'] ? { 'data-source': String(attrs['source']) } : {},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t// A React chip (with the leading source icon) only when the consumer asks for\n\t\t// it — otherwise the plain renderHTML chip is kept (unchanged for CRM etc.).\n\t\t...(options.renderChipIcon\n\t\t\t? {\n\t\t\t\t\taddNodeView() {\n\t\t\t\t\t\treturn ReactNodeViewRenderer(\n\t\t\t\t\t\t\tbuildMentionChipNodeView({\n\t\t\t\t\t\t\t\tcssClass,\n\t\t\t\t\t\t\t\tchar,\n\t\t\t\t\t\t\t\trenderChipIcon: options.renderChipIcon,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t }\n\t\t\t: {}),\n\t}).configure({\n\t\tHTMLAttributes: { class: cssClass },\n\t\trenderText: ({ options: opt, node }: any) =>\n\t\t\t`${node.attrs['kind'] ? '' : opt.suggestion.char}${node.attrs['label']}`,\n\t\trenderHTML: ({ options: opt, node }: any) => [\n\t\t\t'span',\n\t\t\tmergeAttributes(\n\t\t\t\topt.HTMLAttributes,\n\t\t\t\tnode.attrs['kind'] ? { 'data-kind': String(node.attrs['kind']) } : {},\n\t\t\t\tnode.attrs['source']\n\t\t\t\t\t? { 'data-source': String(node.attrs['source']) }\n\t\t\t\t\t: {},\n\t\t\t),\n\t\t\t`${node.attrs['kind'] ? '' : opt.suggestion.char}${node.attrs['label']}`,\n\t\t],\n\t\tsuggestion: {\n\t\t\tchar,\n\t\t\tallowSpaces: true,\n\t\t\titems: ({ query }: { query: string }) =>\n\t\t\t\titemsRef.current.filter((a) =>\n\t\t\t\t\ta.label.toLowerCase().includes(query.toLowerCase()),\n\t\t\t\t),\n\t\t\tcommand: ({ editor, range, props }: any) => {\n\t\t\t\tpickedRef.picked = true;\n\t\t\t\teditor\n\t\t\t\t\t.chain()\n\t\t\t\t\t.focus()\n\t\t\t\t\t.deleteRange(range)\n\t\t\t\t\t.insertContent({\n\t\t\t\t\t\ttype: name,\n\t\t\t\t\t\tattrs: {\n\t\t\t\t\t\t\tid: props.id,\n\t\t\t\t\t\t\tlabel: props.label,\n\t\t\t\t\t\t\tkind: props.meta?.kind ?? null,\n\t\t\t\t\t\t\tsource: props.meta?.source ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.run();\n\t\t\t\tonSelect?.(props, char);\n\t\t\t},\n\t\t\trender: buildRender(options, pickedRef),\n\t\t},\n\t});\n}\n\nexport function buildAgentMentionExtension(\n\tagentsRef: { current: MentionItem[] },\n\tonSelect?: (item: MentionItem, char: '@' | '#') => void,\n\trenderItem?: (item: MentionItem, isActive: boolean) => ReactNode,\n\trenderDropdown?: (props: MentionDropdownRenderProps) => ReactNode,\n\tremoveTriggerOnDismiss?: boolean,\n\trenderChipIcon?: (source: string | null, kind: string | null) => ReactNode,\n) {\n\treturn buildMentionExtension(\n\t\t'mentionAgent',\n\t\t'bik-mention bik-mention--agent',\n\t\t'@',\n\t\tagentsRef,\n\t\tonSelect,\n\t\t{ renderItem, renderDropdown, removeTriggerOnDismiss, renderChipIcon },\n\t);\n}\n\nexport function buildTeamMentionExtension(\n\tteamsRef: { current: MentionItem[] },\n\tonSelect?: (item: MentionItem, char: '@' | '#') => void,\n\trenderItem?: (item: MentionItem, isActive: boolean) => ReactNode,\n\trenderDropdown?: (props: MentionDropdownRenderProps) => ReactNode,\n\tremoveTriggerOnDismiss?: boolean,\n) {\n\treturn buildMentionExtension(\n\t\t'mentionTeam',\n\t\t'bik-mention bik-mention--team',\n\t\t'#',\n\t\tteamsRef,\n\t\tonSelect,\n\t\t{ renderItem, renderDropdown, removeTriggerOnDismiss },\n\t);\n}\n"],"names":["buildRender","options","pickedRef","renderItem","renderDropdown","removeTriggerOnDismiss","component","popup","latestProps","onDocMouseDown","dismiss","editor","range","props","ReactRenderer","MentionDropdown","createSuggestionPopup","event","target","buildMentionExtension","name","cssClass","char","itemsRef","onSelect","Mention","el","attrs","ReactNodeViewRenderer","buildMentionChipNodeView","opt","node","mergeAttributes","query","a","buildAgentMentionExtension","agentsRef","renderChipIcon","buildTeamMentionExtension","teamsRef"],"mappings":"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"}
|