payload-richtext-tiptap 0.0.41 → 0.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/src/fields/TiptapEditor/Components.d.ts.map +1 -1
  2. package/dist/src/fields/TiptapEditor/Components.js +3 -3
  3. package/dist/src/fields/TiptapEditor/Components.js.map +1 -1
  4. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.d.ts +4 -0
  5. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.d.ts.map +1 -0
  6. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.js +208 -0
  7. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.js.map +1 -0
  8. package/dist/src/fields/TiptapEditor/extensions/AICommand/AIMenuList.d.ts +5 -0
  9. package/dist/src/fields/TiptapEditor/extensions/AICommand/AIMenuList.d.ts.map +1 -0
  10. package/dist/src/fields/TiptapEditor/extensions/AICommand/AIMenuList.js +123 -0
  11. package/dist/src/fields/TiptapEditor/extensions/AICommand/AIMenuList.js.map +1 -0
  12. package/dist/src/fields/TiptapEditor/extensions/AICommand/CommandButton.d.ts +10 -0
  13. package/dist/src/fields/TiptapEditor/extensions/AICommand/CommandButton.d.ts.map +1 -0
  14. package/dist/src/fields/TiptapEditor/extensions/AICommand/CommandButton.js +29 -0
  15. package/dist/src/fields/TiptapEditor/extensions/AICommand/CommandButton.js.map +1 -0
  16. package/dist/src/fields/TiptapEditor/extensions/AICommand/MenuList.d.ts +5 -0
  17. package/dist/src/fields/TiptapEditor/extensions/AICommand/MenuList.d.ts.map +1 -0
  18. package/dist/src/fields/TiptapEditor/extensions/AICommand/MenuList.js +123 -0
  19. package/dist/src/fields/TiptapEditor/extensions/AICommand/MenuList.js.map +1 -0
  20. package/dist/src/fields/TiptapEditor/extensions/AICommand/groups.d.ts +4 -0
  21. package/dist/src/fields/TiptapEditor/extensions/AICommand/groups.d.ts.map +1 -0
  22. package/dist/src/fields/TiptapEditor/extensions/AICommand/groups.js +260 -0
  23. package/dist/src/fields/TiptapEditor/extensions/AICommand/groups.js.map +1 -0
  24. package/dist/src/fields/TiptapEditor/extensions/AICommand/index.d.ts +2 -0
  25. package/dist/src/fields/TiptapEditor/extensions/AICommand/index.d.ts.map +1 -0
  26. package/dist/src/fields/TiptapEditor/extensions/AICommand/index.js +3 -0
  27. package/dist/src/fields/TiptapEditor/extensions/AICommand/index.js.map +1 -0
  28. package/dist/src/fields/TiptapEditor/extensions/AICommand/types.d.ts +22 -0
  29. package/dist/src/fields/TiptapEditor/extensions/AICommand/types.d.ts.map +1 -0
  30. package/dist/src/fields/TiptapEditor/extensions/AICommand/types.js +3 -0
  31. package/dist/src/fields/TiptapEditor/extensions/AICommand/types.js.map +1 -0
  32. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/ImageUpload.d.ts.map +1 -1
  33. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/ImageUpload.js +3 -2
  34. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/ImageUpload.js.map +1 -1
  35. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/view/ImageUpload.d.ts +2 -2
  36. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/view/ImageUpload.d.ts.map +1 -1
  37. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/view/ImageUpload.js +38 -21
  38. package/dist/src/fields/TiptapEditor/extensions/ImageUpload/view/ImageUpload.js.map +1 -1
  39. package/dist/src/fields/TiptapEditor/extensions/extension-kit.d.ts +3 -1
  40. package/dist/src/fields/TiptapEditor/extensions/extension-kit.d.ts.map +1 -1
  41. package/dist/src/fields/TiptapEditor/extensions/extension-kit.js +22 -15
  42. package/dist/src/fields/TiptapEditor/extensions/extension-kit.js.map +1 -1
  43. package/dist/src/fields/TiptapEditor/extensions/index.d.ts +1 -0
  44. package/dist/src/fields/TiptapEditor/extensions/index.d.ts.map +1 -1
  45. package/dist/src/fields/TiptapEditor/extensions/index.js +1 -0
  46. package/dist/src/fields/TiptapEditor/extensions/index.js.map +1 -1
  47. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.d.ts +4 -1
  48. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.d.ts.map +1 -1
  49. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.js +3 -2
  50. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.js.map +1 -1
  51. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-draft-selector-commands.d.ts +8 -0
  52. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-draft-selector-commands.d.ts.map +1 -0
  53. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-draft-selector-commands.js +94 -0
  54. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-draft-selector-commands.js.map +1 -0
  55. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.d.ts +7 -0
  56. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.d.ts.map +1 -0
  57. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.js +193 -0
  58. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.js.map +1 -0
  59. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/index.d.ts +2 -0
  60. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/index.d.ts.map +1 -0
  61. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/index.js +3 -0
  62. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/index.js.map +1 -0
  63. package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.d.ts.map +1 -1
  64. package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.js +29 -17
  65. package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.js.map +1 -1
  66. package/dist/src/fields/TiptapEditor/hooks/useBlockEditor.d.ts +3 -1
  67. package/dist/src/fields/TiptapEditor/hooks/useBlockEditor.d.ts.map +1 -1
  68. package/dist/src/fields/TiptapEditor/hooks/useBlockEditor.js +4 -3
  69. package/dist/src/fields/TiptapEditor/hooks/useBlockEditor.js.map +1 -1
  70. package/dist/src/fields/TiptapEditor/lib/extract.d.ts.map +1 -1
  71. package/dist/src/fields/TiptapEditor/lib/extract.js +6 -5
  72. package/dist/src/fields/TiptapEditor/lib/extract.js.map +1 -1
  73. package/dist/src/fields/TiptapEditor/types.d.js +3 -0
  74. package/dist/src/fields/TiptapEditor/types.d.js.map +1 -0
  75. package/dist/src/styles.css +0 -4
  76. package/dist/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Components.d.ts","sourceRoot":"","sources":["../../../../src/fields/TiptapEditor/Components.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,eAAe,EAAe,MAAM,SAAS,CAAC;AAqCvD,eAAO,MAAM,eAAe,EAAE,eA2B7B,CAAC"}
1
+ {"version":3,"file":"Components.d.ts","sourceRoot":"","sources":["../../../../src/fields/TiptapEditor/Components.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,eAAe,EAA0B,MAAM,SAAS,CAAC;AAqClE,eAAO,MAAM,eAAe,EAAE,eA4B7B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import React, { useCallback, useEffect, useState } from "react";
3
+ import { useCallback, useEffect, useState } from "react";
4
4
  // import 'cal-sans'
5
5
  // import '@fontsource/inter/100.css'
6
6
  // import '@fontsource/inter/200.css'
@@ -10,8 +10,7 @@ import React, { useCallback, useEffect, useState } from "react";
10
10
  // import '@fontsource/inter/600.css'
11
11
  // import '@fontsource/inter/700.css'
12
12
  // import { BlockEditor } from './features/BlockEditor'
13
- import { useField } from "@payloadcms/ui";
14
- import { useLocale } from "@payloadcms/ui";
13
+ import { useField, useLocale } from "@payloadcms/ui";
15
14
  import { BlockEditor } from "./features/BlockEditor/BlockEditor.js";
16
15
  const useDarkmode = ()=>{
17
16
  const [isDarkMode, setIsDarkMode] = useState(typeof window !== "undefined" ? document.documentElement.getAttribute("data-theme") === "dark" : false);
@@ -55,6 +54,7 @@ export const EditorComponent = (props)=>{
55
54
  children: /*#__PURE__*/ _jsx(BlockEditor, {
56
55
  hasCollab: hasCollab,
57
56
  content: value,
57
+ openAssetHQHandler: (listener)=>{},
58
58
  handleChange: (value)=>{
59
59
  setValue(value);
60
60
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/TiptapEditor/Components.tsx"],"sourcesContent":["\"use client\";\nimport React, { useCallback, useEffect, useState } from \"react\";\n\n// import 'cal-sans'\n\n// import '@fontsource/inter/100.css'\n// import '@fontsource/inter/200.css'\n// import '@fontsource/inter/300.css'\n// import '@fontsource/inter/400.css'\n// import '@fontsource/inter/500.css'\n// import '@fontsource/inter/600.css'\n// import '@fontsource/inter/700.css'\n// import { BlockEditor } from './features/BlockEditor'\nimport { useField } from \"@payloadcms/ui\";\nimport { useLocale } from \"@payloadcms/ui\";\nimport { BlockEditor } from \"./features/BlockEditor/BlockEditor.js\";\n\n// import \"../../styles.css\";\nimport { JSONField } from \"payload\";\nimport { CustomComponent, ServerProps } from \"payload\";\n\ntype Props = JSONField & ServerProps;\n\nconst useDarkmode = () => {\n const [isDarkMode, setIsDarkMode] = useState<boolean>(\n typeof window !== \"undefined\"\n ? document.documentElement.getAttribute(\"data-theme\") === \"dark\"\n : false\n );\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = () => setIsDarkMode(mediaQuery.matches);\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n useEffect(() => {\n document.documentElement.classList.toggle(\"dark\", isDarkMode);\n }, [isDarkMode]);\n\n const toggleDarkMode = useCallback(\n () => setIsDarkMode((isDark) => !isDark),\n []\n );\n const lightMode = useCallback(() => setIsDarkMode(false), []);\n const darkMode = useCallback(() => setIsDarkMode(true), []);\n\n return {\n isDarkMode,\n toggleDarkMode,\n lightMode,\n darkMode,\n };\n};\n\nexport const EditorComponent: CustomComponent = (props) => {\n const { value, setValue } = useField<any>({\n path: props.name,\n });\n\n useDarkmode();\n const hasCollab = false;\n // const { i18n } = useTranslation()\n\n const { code } = useLocale();\n return (\n <div\n lang={code}\n className=\"editor-tiptap content-field content-field-disabled\"\n style={{ width: \"100%\", height: \"100%\", overflow: \"visible\" }}\n >\n {/* {DarkModeSwitcher} */}\n {/* <FieldLabel label={props?.label ?? capitalize(props?.name) ?? ''} /> */}\n <BlockEditor\n hasCollab={hasCollab}\n content={value}\n handleChange={(value) => {\n setValue(value);\n }}\n />\n </div>\n );\n};\n"],"names":["React","useCallback","useEffect","useState","useField","useLocale","BlockEditor","useDarkmode","isDarkMode","setIsDarkMode","window","document","documentElement","getAttribute","mediaQuery","matchMedia","handleChange","matches","addEventListener","removeEventListener","classList","toggle","toggleDarkMode","isDark","lightMode","darkMode","EditorComponent","props","value","setValue","path","name","hasCollab","code","div","lang","className","style","width","height","overflow","content"],"mappings":"AAAA;;AACA,OAAOA,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAEhE,oBAAoB;AAEpB,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,uDAAuD;AACvD,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SAASC,WAAW,QAAQ,wCAAwC;AAQpE,MAAMC,cAAc;IAClB,MAAM,CAACC,YAAYC,cAAc,GAAGN,SAClC,OAAOO,WAAW,cACdC,SAASC,eAAe,CAACC,YAAY,CAAC,kBAAkB,SACxD;IAGNX,UAAU;QACR,MAAMY,aAAaJ,OAAOK,UAAU,CAAC;QACrC,MAAMC,eAAe,IAAMP,cAAcK,WAAWG,OAAO;QAC3DH,WAAWI,gBAAgB,CAAC,UAAUF;QACtC,OAAO,IAAMF,WAAWK,mBAAmB,CAAC,UAAUH;IACxD,GAAG,EAAE;IAELd,UAAU;QACRS,SAASC,eAAe,CAACQ,SAAS,CAACC,MAAM,CAAC,QAAQb;IACpD,GAAG;QAACA;KAAW;IAEf,MAAMc,iBAAiBrB,YACrB,IAAMQ,cAAc,CAACc,SAAW,CAACA,SACjC,EAAE;IAEJ,MAAMC,YAAYvB,YAAY,IAAMQ,cAAc,QAAQ,EAAE;IAC5D,MAAMgB,WAAWxB,YAAY,IAAMQ,cAAc,OAAO,EAAE;IAE1D,OAAO;QACLD;QACAc;QACAE;QACAC;IACF;AACF;AAEA,OAAO,MAAMC,kBAAmC,CAACC;IAC/C,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGzB,SAAc;QACxC0B,MAAMH,MAAMI,IAAI;IAClB;IAEAxB;IACA,MAAMyB,YAAY;IAClB,oCAAoC;IAEpC,MAAM,EAAEC,IAAI,EAAE,GAAG5B;IACjB,qBACE,KAAC6B;QACCC,MAAMF;QACNG,WAAU;QACVC,OAAO;YAAEC,OAAO;YAAQC,QAAQ;YAAQC,UAAU;QAAU;kBAI5D,cAAA,KAAClC;YACC0B,WAAWA;YACXS,SAASb;YACTZ,cAAc,CAACY;gBACbC,SAASD;YACX;;;AAIR,EAAE"}
1
+ {"version":3,"sources":["../../../../src/fields/TiptapEditor/Components.tsx"],"sourcesContent":["\"use client\";\nimport { useCallback, useEffect, useState } from \"react\";\n\n// import 'cal-sans'\n\n// import '@fontsource/inter/100.css'\n// import '@fontsource/inter/200.css'\n// import '@fontsource/inter/300.css'\n// import '@fontsource/inter/400.css'\n// import '@fontsource/inter/500.css'\n// import '@fontsource/inter/600.css'\n// import '@fontsource/inter/700.css'\n// import { BlockEditor } from './features/BlockEditor'\nimport { useField, useLocale } from \"@payloadcms/ui\";\nimport { BlockEditor } from \"./features/BlockEditor/BlockEditor.js\";\n\n// import \"../../styles.css\";\nimport { CustomComponent, JSONField, ServerProps } from \"payload\";\n\ntype Props = JSONField & ServerProps;\n\nconst useDarkmode = () => {\n const [isDarkMode, setIsDarkMode] = useState<boolean>(\n typeof window !== \"undefined\"\n ? document.documentElement.getAttribute(\"data-theme\") === \"dark\"\n : false\n );\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = () => setIsDarkMode(mediaQuery.matches);\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n useEffect(() => {\n document.documentElement.classList.toggle(\"dark\", isDarkMode);\n }, [isDarkMode]);\n\n const toggleDarkMode = useCallback(\n () => setIsDarkMode((isDark) => !isDark),\n []\n );\n const lightMode = useCallback(() => setIsDarkMode(false), []);\n const darkMode = useCallback(() => setIsDarkMode(true), []);\n\n return {\n isDarkMode,\n toggleDarkMode,\n lightMode,\n darkMode,\n };\n};\n\nexport const EditorComponent: CustomComponent = (props) => {\n const { value, setValue } = useField<any>({\n path: props.name,\n });\n\n useDarkmode();\n const hasCollab = false;\n // const { i18n } = useTranslation()\n\n const { code } = useLocale();\n return (\n <div\n lang={code}\n className=\"editor-tiptap content-field content-field-disabled\"\n style={{ width: \"100%\", height: \"100%\", overflow: \"visible\" }}\n >\n {/* {DarkModeSwitcher} */}\n {/* <FieldLabel label={props?.label ?? capitalize(props?.name) ?? ''} /> */}\n <BlockEditor\n hasCollab={hasCollab}\n content={value}\n openAssetHQHandler={(listener) => {}}\n handleChange={(value) => {\n setValue(value);\n }}\n />\n </div>\n );\n};\n"],"names":["useCallback","useEffect","useState","useField","useLocale","BlockEditor","useDarkmode","isDarkMode","setIsDarkMode","window","document","documentElement","getAttribute","mediaQuery","matchMedia","handleChange","matches","addEventListener","removeEventListener","classList","toggle","toggleDarkMode","isDark","lightMode","darkMode","EditorComponent","props","value","setValue","path","name","hasCollab","code","div","lang","className","style","width","height","overflow","content","openAssetHQHandler","listener"],"mappings":"AAAA;;AACA,SAASA,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAEzD,oBAAoB;AAEpB,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,qCAAqC;AACrC,uDAAuD;AACvD,SAASC,QAAQ,EAAEC,SAAS,QAAQ,iBAAiB;AACrD,SAASC,WAAW,QAAQ,wCAAwC;AAOpE,MAAMC,cAAc;IAClB,MAAM,CAACC,YAAYC,cAAc,GAAGN,SAClC,OAAOO,WAAW,cACdC,SAASC,eAAe,CAACC,YAAY,CAAC,kBAAkB,SACxD;IAGNX,UAAU;QACR,MAAMY,aAAaJ,OAAOK,UAAU,CAAC;QACrC,MAAMC,eAAe,IAAMP,cAAcK,WAAWG,OAAO;QAC3DH,WAAWI,gBAAgB,CAAC,UAAUF;QACtC,OAAO,IAAMF,WAAWK,mBAAmB,CAAC,UAAUH;IACxD,GAAG,EAAE;IAELd,UAAU;QACRS,SAASC,eAAe,CAACQ,SAAS,CAACC,MAAM,CAAC,QAAQb;IACpD,GAAG;QAACA;KAAW;IAEf,MAAMc,iBAAiBrB,YACrB,IAAMQ,cAAc,CAACc,SAAW,CAACA,SACjC,EAAE;IAEJ,MAAMC,YAAYvB,YAAY,IAAMQ,cAAc,QAAQ,EAAE;IAC5D,MAAMgB,WAAWxB,YAAY,IAAMQ,cAAc,OAAO,EAAE;IAE1D,OAAO;QACLD;QACAc;QACAE;QACAC;IACF;AACF;AAEA,OAAO,MAAMC,kBAAmC,CAACC;IAC/C,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGzB,SAAc;QACxC0B,MAAMH,MAAMI,IAAI;IAClB;IAEAxB;IACA,MAAMyB,YAAY;IAClB,oCAAoC;IAEpC,MAAM,EAAEC,IAAI,EAAE,GAAG5B;IACjB,qBACE,KAAC6B;QACCC,MAAMF;QACNG,WAAU;QACVC,OAAO;YAAEC,OAAO;YAAQC,QAAQ;YAAQC,UAAU;QAAU;kBAI5D,cAAA,KAAClC;YACC0B,WAAWA;YACXS,SAASb;YACTc,oBAAoB,CAACC,YAAc;YACnC3B,cAAc,CAACY;gBACbC,SAASD;YACX;;;AAIR,EAAE"}
@@ -0,0 +1,4 @@
1
+ import { Extension } from "@tiptap/core";
2
+ export declare const AICommand: Extension<any, any>;
3
+ export default AICommand;
4
+ //# sourceMappingURL=AICommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AICommand.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/AICommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBjD,eAAO,MAAM,SAAS,qBAoRpB,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -0,0 +1,208 @@
1
+ "use client";
2
+ import { Extension } from "@tiptap/core";
3
+ import { ReactRenderer } from "@tiptap/react";
4
+ import Suggestion from "@tiptap/suggestion";
5
+ import { PluginKey } from "@tiptap/pm/state";
6
+ import tippy from "tippy.js";
7
+ import { GROUPS } from "./groups.js";
8
+ import { AICommandPanel } from "../../features/panels/AICommandPanel/AICommandPanel.js";
9
+ const extensionName = "aiCommand";
10
+ let popup;
11
+ export const AICommand = Extension.create({
12
+ name: extensionName,
13
+ priority: 200,
14
+ onCreate () {
15
+ const t = tippy;
16
+ popup = t("body", {
17
+ interactive: true,
18
+ trigger: "manual",
19
+ placement: "bottom-start",
20
+ theme: "slash-command",
21
+ // maxWidth: "16rem",
22
+ offset: [
23
+ 16,
24
+ 8
25
+ ],
26
+ popperOptions: {
27
+ strategy: "fixed",
28
+ modifiers: [
29
+ {
30
+ name: "flip",
31
+ enabled: false
32
+ }
33
+ ]
34
+ }
35
+ });
36
+ },
37
+ addProseMirrorPlugins () {
38
+ return [
39
+ Suggestion({
40
+ editor: this.editor,
41
+ char: " ",
42
+ allowSpaces: true,
43
+ startOfLine: true,
44
+ pluginKey: new PluginKey(extensionName),
45
+ allow: ({ state, range })=>{
46
+ const $from = state.doc.resolve(range.from);
47
+ const isRootDepth = $from.depth === 1;
48
+ const isParagraph = $from.parent.type.name === "paragraph";
49
+ const isStartOfNode = $from.parent.textContent?.charAt(0) === " ";
50
+ // TODO
51
+ const isInColumn = this.editor.isActive("column");
52
+ const afterContent = $from.parent.textContent?.substring($from.parent.textContent?.indexOf("/"));
53
+ const isValidAfterContent = !afterContent?.endsWith(" ");
54
+ return (isRootDepth && isParagraph && isStartOfNode || isInColumn && isParagraph && isStartOfNode) && isValidAfterContent;
55
+ },
56
+ command: ({ editor, props })=>{
57
+ const { view, state } = editor;
58
+ const { $head, $from } = view.state.selection;
59
+ const end = $from.pos;
60
+ const from = $head?.nodeBefore ? end - ($head.nodeBefore.text?.substring($head.nodeBefore.text?.indexOf(" ")).length ?? 0) : $from.start();
61
+ const tr = state.tr.deleteRange(from, end);
62
+ view.dispatch(tr);
63
+ props.action(editor);
64
+ view.focus();
65
+ },
66
+ items: ({ query })=>{
67
+ const withFilteredCommands = GROUPS.map((group)=>({
68
+ ...group,
69
+ commands: group.commands.filter((item)=>{
70
+ const labelNormalized = item.label.toLowerCase().trim();
71
+ const queryNormalized = query.toLowerCase().trim();
72
+ if (item.aliases) {
73
+ const aliases = item.aliases.map((alias)=>alias.toLowerCase().trim());
74
+ return labelNormalized.includes(queryNormalized) || aliases.includes(queryNormalized);
75
+ }
76
+ return labelNormalized.includes(queryNormalized);
77
+ }).filter((command)=>command.shouldBeHidden ? !command.shouldBeHidden(this.editor) : true)
78
+ }));
79
+ const withoutEmptyGroups = withFilteredCommands.filter((group)=>{
80
+ if (group.commands.length > 0) {
81
+ return true;
82
+ }
83
+ return false;
84
+ });
85
+ const withEnabledSettings = withoutEmptyGroups.map((group)=>({
86
+ ...group,
87
+ commands: group.commands.map((command)=>({
88
+ ...command,
89
+ isEnabled: true
90
+ }))
91
+ }));
92
+ return withEnabledSettings;
93
+ },
94
+ render: ()=>{
95
+ let component;
96
+ let scrollHandler = null;
97
+ return {
98
+ onStart: (props)=>{
99
+ component = new ReactRenderer(AICommandPanel, {
100
+ props,
101
+ editor: props.editor
102
+ });
103
+ const { view } = props.editor;
104
+ const editorNode = view.dom;
105
+ const getReferenceClientRect = ()=>{
106
+ if (!props.clientRect) {
107
+ return props.editor.storage[extensionName].rect;
108
+ }
109
+ const rect = props.clientRect();
110
+ if (!rect) {
111
+ return props.editor.storage[extensionName].rect;
112
+ }
113
+ let yPos = rect.y;
114
+ if (rect.top + component.element.offsetHeight + 40 > window.innerHeight) {
115
+ const diff = rect.top + component.element.offsetHeight - window.innerHeight + 40;
116
+ yPos = rect.y - diff;
117
+ }
118
+ // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen
119
+ const editorXOffset = editorNode.getBoundingClientRect().x;
120
+ const boundigClient = editorNode.getBoundingClientRect();
121
+ return new DOMRect(rect.x, yPos, boundigClient.width, rect.height);
122
+ };
123
+ scrollHandler = ()=>{
124
+ popup?.[0].setProps({
125
+ getReferenceClientRect
126
+ });
127
+ };
128
+ view.dom.parentElement?.addEventListener("scroll", scrollHandler);
129
+ popup?.[0].setProps({
130
+ getReferenceClientRect,
131
+ appendTo: ()=>document.body,
132
+ content: component.element
133
+ });
134
+ popup?.[0].show();
135
+ },
136
+ onUpdate (props) {
137
+ component.updateProps(props);
138
+ const { view } = props.editor;
139
+ const editorNode = view.dom;
140
+ const getReferenceClientRect = ()=>{
141
+ if (!props.clientRect) {
142
+ return props.editor.storage[extensionName].rect;
143
+ }
144
+ const rect = props.clientRect();
145
+ if (!rect) {
146
+ return props.editor.storage[extensionName].rect;
147
+ }
148
+ // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen
149
+ return new DOMRect(rect.x, rect.y, rect.width, rect.height);
150
+ };
151
+ let scrollHandler = ()=>{
152
+ popup?.[0].setProps({
153
+ getReferenceClientRect
154
+ });
155
+ };
156
+ view.dom.parentElement?.addEventListener("scroll", scrollHandler);
157
+ // eslint-disable-next-line no-param-reassign
158
+ props.editor.storage[extensionName].rect = props.clientRect ? getReferenceClientRect() : {
159
+ width: 0,
160
+ height: 0,
161
+ left: 0,
162
+ top: 0,
163
+ right: 0,
164
+ bottom: 0
165
+ };
166
+ popup?.[0].setProps({
167
+ getReferenceClientRect
168
+ });
169
+ },
170
+ onKeyDown (props) {
171
+ if (props.event.key === "Escape") {
172
+ popup?.[0].hide();
173
+ return true;
174
+ }
175
+ if (!popup?.[0].state.isShown) {
176
+ popup?.[0].show();
177
+ }
178
+ return component.ref?.onKeyDown(props);
179
+ },
180
+ onExit (props) {
181
+ popup?.[0].hide();
182
+ if (scrollHandler) {
183
+ const { view } = props.editor;
184
+ view.dom.parentElement?.removeEventListener("scroll", scrollHandler);
185
+ }
186
+ component.destroy();
187
+ }
188
+ };
189
+ }
190
+ })
191
+ ];
192
+ },
193
+ addStorage () {
194
+ return {
195
+ rect: {
196
+ width: 0,
197
+ height: 0,
198
+ left: 0,
199
+ top: 0,
200
+ right: 0,
201
+ bottom: 0
202
+ }
203
+ };
204
+ }
205
+ });
206
+ export default AICommand;
207
+
208
+ //# sourceMappingURL=AICommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/AICommand.ts"],"sourcesContent":["\"use client\";\nimport { Editor, Extension } from \"@tiptap/core\";\nimport { ReactRenderer } from \"@tiptap/react\";\nimport Suggestion, {\n SuggestionProps,\n SuggestionKeyDownProps,\n} from \"@tiptap/suggestion\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport tippy from \"tippy.js\";\n\nimport { GROUPS } from \"./groups.js\";\nimport { AIMenuList } from \"./AIMenuList.js\";\nimport { AIEditorPanel } from \"../../features/panels/AIEditorPanel/AIEditorPanel.js\";\nimport { AICommandPanel } from \"../../features/panels/AICommandPanel/AICommandPanel.js\";\n\nconst extensionName = \"aiCommand\";\n\nlet popup: any;\n\nexport const AICommand = Extension.create({\n name: extensionName,\n\n priority: 200,\n\n onCreate() {\n const t = tippy as any;\n popup = t(\"body\", {\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\",\n theme: \"slash-command\",\n // maxWidth: \"16rem\",\n offset: [16, 8],\n popperOptions: {\n strategy: \"fixed\",\n modifiers: [\n {\n name: \"flip\",\n enabled: false,\n },\n ],\n },\n });\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: \" \",\n allowSpaces: true,\n startOfLine: true,\n pluginKey: new PluginKey(extensionName),\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from);\n const isRootDepth = $from.depth === 1;\n const isParagraph = $from.parent.type.name === \"paragraph\";\n const isStartOfNode = $from.parent.textContent?.charAt(0) === \" \";\n // TODO\n const isInColumn = this.editor.isActive(\"column\");\n\n const afterContent = $from.parent.textContent?.substring(\n $from.parent.textContent?.indexOf(\"/\")\n );\n const isValidAfterContent = !afterContent?.endsWith(\" \");\n\n return (\n ((isRootDepth && isParagraph && isStartOfNode) ||\n (isInColumn && isParagraph && isStartOfNode)) &&\n isValidAfterContent\n );\n },\n command: ({ editor, props }: { editor: Editor; props: any }) => {\n const { view, state } = editor;\n const { $head, $from } = view.state.selection;\n\n const end = $from.pos;\n const from = $head?.nodeBefore\n ? end -\n ($head.nodeBefore.text?.substring(\n $head.nodeBefore.text?.indexOf(\" \")\n ).length ?? 0)\n : $from.start();\n\n const tr = state.tr.deleteRange(from, end);\n view.dispatch(tr);\n\n props.action(editor);\n view.focus();\n },\n items: ({ query }: { query: string }) => {\n const withFilteredCommands = GROUPS.map((group) => ({\n ...group,\n commands: group.commands\n .filter((item) => {\n const labelNormalized = item.label.toLowerCase().trim();\n const queryNormalized = query.toLowerCase().trim();\n\n if (item.aliases) {\n const aliases = item.aliases.map((alias) =>\n alias.toLowerCase().trim()\n );\n\n return (\n labelNormalized.includes(queryNormalized) ||\n aliases.includes(queryNormalized)\n );\n }\n\n return labelNormalized.includes(queryNormalized);\n })\n .filter((command) =>\n command.shouldBeHidden\n ? !command.shouldBeHidden(this.editor)\n : true\n ),\n }));\n\n const withoutEmptyGroups = withFilteredCommands.filter((group) => {\n if (group.commands.length > 0) {\n return true;\n }\n\n return false;\n });\n\n const withEnabledSettings = withoutEmptyGroups.map((group) => ({\n ...group,\n commands: group.commands.map((command) => ({\n ...command,\n isEnabled: true,\n })),\n }));\n\n return withEnabledSettings;\n },\n render: () => {\n let component: any;\n\n let scrollHandler: (() => void) | null = null;\n\n return {\n onStart: (props: SuggestionProps) => {\n component = new ReactRenderer(AICommandPanel, {\n props,\n editor: props.editor,\n });\n\n const { view } = props.editor;\n\n const editorNode = view.dom as HTMLElement;\n\n const getReferenceClientRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect;\n }\n\n const rect = props.clientRect();\n\n if (!rect) {\n return props.editor.storage[extensionName].rect;\n }\n\n let yPos = rect.y;\n\n if (\n rect.top + component.element.offsetHeight + 40 >\n window.innerHeight\n ) {\n const diff =\n rect.top +\n component.element.offsetHeight -\n window.innerHeight +\n 40;\n yPos = rect.y - diff;\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n const editorXOffset = editorNode.getBoundingClientRect().x;\n const boundigClient = editorNode.getBoundingClientRect();\n\n return new DOMRect(\n rect.x,\n yPos,\n boundigClient.width,\n rect.height\n );\n };\n\n scrollHandler = () => {\n popup?.[0].setProps({\n getReferenceClientRect,\n });\n };\n\n view.dom.parentElement?.addEventListener(\"scroll\", scrollHandler);\n\n popup?.[0].setProps({\n getReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n });\n\n popup?.[0].show();\n },\n\n onUpdate(props: SuggestionProps) {\n component.updateProps(props);\n\n const { view } = props.editor;\n\n const editorNode = view.dom as HTMLElement;\n\n const getReferenceClientRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect;\n }\n\n const rect = props.clientRect();\n\n if (!rect) {\n return props.editor.storage[extensionName].rect;\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n return new DOMRect(rect.x, rect.y, rect.width, rect.height);\n };\n\n let scrollHandler = () => {\n popup?.[0].setProps({\n getReferenceClientRect,\n });\n };\n\n view.dom.parentElement?.addEventListener(\"scroll\", scrollHandler);\n\n // eslint-disable-next-line no-param-reassign\n props.editor.storage[extensionName].rect = props.clientRect\n ? getReferenceClientRect()\n : {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n };\n popup?.[0].setProps({\n getReferenceClientRect,\n });\n },\n\n onKeyDown(props: SuggestionKeyDownProps) {\n if (props.event.key === \"Escape\") {\n popup?.[0].hide();\n\n return true;\n }\n\n if (!popup?.[0].state.isShown) {\n popup?.[0].show();\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit(props) {\n popup?.[0].hide();\n if (scrollHandler) {\n const { view } = props.editor;\n view.dom.parentElement?.removeEventListener(\n \"scroll\",\n scrollHandler\n );\n }\n component.destroy();\n },\n };\n },\n }),\n ];\n },\n\n addStorage() {\n return {\n rect: {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n },\n };\n },\n});\n\nexport default AICommand;\n"],"names":["Extension","ReactRenderer","Suggestion","PluginKey","tippy","GROUPS","AICommandPanel","extensionName","popup","AICommand","create","name","priority","onCreate","t","interactive","trigger","placement","theme","offset","popperOptions","strategy","modifiers","enabled","addProseMirrorPlugins","editor","char","allowSpaces","startOfLine","pluginKey","allow","state","range","$from","doc","resolve","from","isRootDepth","depth","isParagraph","parent","type","isStartOfNode","textContent","charAt","isInColumn","isActive","afterContent","substring","indexOf","isValidAfterContent","endsWith","command","props","view","$head","selection","end","pos","nodeBefore","text","length","start","tr","deleteRange","dispatch","action","focus","items","query","withFilteredCommands","map","group","commands","filter","item","labelNormalized","label","toLowerCase","trim","queryNormalized","aliases","alias","includes","shouldBeHidden","withoutEmptyGroups","withEnabledSettings","isEnabled","render","component","scrollHandler","onStart","editorNode","dom","getReferenceClientRect","clientRect","storage","rect","yPos","y","top","element","offsetHeight","window","innerHeight","diff","editorXOffset","getBoundingClientRect","x","boundigClient","DOMRect","width","height","setProps","parentElement","addEventListener","appendTo","document","body","content","show","onUpdate","updateProps","left","right","bottom","onKeyDown","event","key","hide","isShown","ref","onExit","removeEventListener","destroy","addStorage"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import { AIMenuListProps } from "./types.js";
3
+ export declare const AIMenuList: React.ForwardRefExoticComponent<AIMenuListProps & React.RefAttributes<unknown>>;
4
+ export default AIMenuList;
5
+ //# sourceMappingURL=AIMenuList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIMenuList.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/AIMenuList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAItD,eAAO,MAAM,UAAU,iFAiJrB,CAAC;AAIH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useCallback, useEffect, useRef, useState } from "react";
3
+ import { DropdownButton } from "../../features/ui/Dropdown/Dropdown.js";
4
+ import { Surface } from "../../features/ui/Surface.js";
5
+ import { Icon } from "../../features/ui/Icon.js";
6
+ export const AIMenuList = /*#__PURE__*/ React.forwardRef((props, ref)=>{
7
+ const scrollContainer = useRef(null);
8
+ const activeItem = useRef(null);
9
+ const [selectedGroupIndex, setSelectedGroupIndex] = useState(0);
10
+ const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);
11
+ // Anytime the groups change, i.e. the user types to narrow it down, we want to
12
+ // reset the current selection to the first menu item
13
+ useEffect(()=>{
14
+ setSelectedGroupIndex(0);
15
+ setSelectedCommandIndex(0);
16
+ }, [
17
+ props.items
18
+ ]);
19
+ const selectItem = useCallback((groupIndex, commandIndex)=>{
20
+ const command = props.items[groupIndex].commands[commandIndex];
21
+ props.command(command);
22
+ }, [
23
+ props
24
+ ]);
25
+ React.useImperativeHandle(ref, ()=>({
26
+ onKeyDown: ({ event })=>{
27
+ if (event.key === "ArrowDown") {
28
+ if (!props.items.length) {
29
+ return false;
30
+ }
31
+ const commands = props.items[selectedGroupIndex].commands;
32
+ let newCommandIndex = selectedCommandIndex + 1;
33
+ let newGroupIndex = selectedGroupIndex;
34
+ if (commands.length - 1 < newCommandIndex) {
35
+ newCommandIndex = 0;
36
+ newGroupIndex = selectedGroupIndex + 1;
37
+ }
38
+ if (props.items.length - 1 < newGroupIndex) {
39
+ newGroupIndex = 0;
40
+ }
41
+ setSelectedCommandIndex(newCommandIndex);
42
+ setSelectedGroupIndex(newGroupIndex);
43
+ return true;
44
+ }
45
+ if (event.key === "ArrowUp") {
46
+ if (!props.items.length) {
47
+ return false;
48
+ }
49
+ let newCommandIndex = selectedCommandIndex - 1;
50
+ let newGroupIndex = selectedGroupIndex;
51
+ if (newCommandIndex < 0) {
52
+ newGroupIndex = selectedGroupIndex - 1;
53
+ newCommandIndex = props.items[newGroupIndex]?.commands.length - 1 || 0;
54
+ }
55
+ if (newGroupIndex < 0) {
56
+ newGroupIndex = props.items.length - 1;
57
+ newCommandIndex = props.items[newGroupIndex].commands.length - 1;
58
+ }
59
+ setSelectedCommandIndex(newCommandIndex);
60
+ setSelectedGroupIndex(newGroupIndex);
61
+ return true;
62
+ }
63
+ if (event.key === "Enter") {
64
+ if (!props.items.length || selectedGroupIndex === -1 || selectedCommandIndex === -1) {
65
+ return false;
66
+ }
67
+ selectItem(selectedGroupIndex, selectedCommandIndex);
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ }));
73
+ useEffect(()=>{
74
+ if (activeItem.current && scrollContainer.current) {
75
+ const offsetTop = activeItem.current.offsetTop;
76
+ const offsetHeight = activeItem.current.offsetHeight;
77
+ scrollContainer.current.scrollTop = offsetTop - offsetHeight;
78
+ }
79
+ }, [
80
+ selectedCommandIndex,
81
+ selectedGroupIndex
82
+ ]);
83
+ const createCommandClickHandler = useCallback((groupIndex, commandIndex)=>{
84
+ return ()=>{
85
+ selectItem(groupIndex, commandIndex);
86
+ };
87
+ }, [
88
+ selectItem
89
+ ]);
90
+ if (!props.items.length) {
91
+ return null;
92
+ }
93
+ return /*#__PURE__*/ _jsx(Surface, {
94
+ ref: scrollContainer,
95
+ className: "text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-2",
96
+ children: /*#__PURE__*/ _jsx("div", {
97
+ className: "grid grid-cols-1 gap-0.5",
98
+ children: props.items.map((group, groupIndex)=>/*#__PURE__*/ _jsxs(React.Fragment, {
99
+ children: [
100
+ /*#__PURE__*/ _jsx("div", {
101
+ className: "text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-4 font-semibold tracking-wider select-none uppercase first:mt-0.5",
102
+ children: group.title
103
+ }, `${group.title}`),
104
+ group.commands.map((command, commandIndex)=>/*#__PURE__*/ _jsxs(DropdownButton, {
105
+ isActive: selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex,
106
+ onClick: createCommandClickHandler(groupIndex, commandIndex),
107
+ children: [
108
+ /*#__PURE__*/ _jsx(Icon, {
109
+ icon: command.icon,
110
+ className: "mr-1"
111
+ }),
112
+ command.label
113
+ ]
114
+ }, `${command.label}`))
115
+ ]
116
+ }, `${group.title}-wrapper`))
117
+ })
118
+ });
119
+ });
120
+ AIMenuList.displayName = "AIMenuList";
121
+ export default AIMenuList;
122
+
123
+ //# sourceMappingURL=AIMenuList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/AIMenuList.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { DropdownButton } from \"../../features/ui/Dropdown/Dropdown.js\";\nimport { Surface } from \"../../features/ui/Surface.js\";\nimport { Command, AIMenuListProps } from \"./types.js\";\n\nimport { Icon } from \"../../features/ui/Icon.js\";\n\nexport const AIMenuList = React.forwardRef((props: AIMenuListProps, ref) => {\n const scrollContainer = useRef<HTMLDivElement>(null);\n const activeItem = useRef<HTMLButtonElement>(null);\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0);\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\n // Anytime the groups change, i.e. the user types to narrow it down, we want to\n // reset the current selection to the first menu item\n useEffect(() => {\n setSelectedGroupIndex(0);\n setSelectedCommandIndex(0);\n }, [props.items]);\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const command = props.items[groupIndex].commands[commandIndex];\n props.command(command);\n },\n [props]\n );\n\n React.useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === \"ArrowDown\") {\n if (!props.items.length) {\n return false;\n }\n\n const commands = props.items[selectedGroupIndex].commands;\n\n let newCommandIndex = selectedCommandIndex + 1;\n let newGroupIndex = selectedGroupIndex;\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0;\n newGroupIndex = selectedGroupIndex + 1;\n }\n\n if (props.items.length - 1 < newGroupIndex) {\n newGroupIndex = 0;\n }\n\n setSelectedCommandIndex(newCommandIndex);\n setSelectedGroupIndex(newGroupIndex);\n\n return true;\n }\n\n if (event.key === \"ArrowUp\") {\n if (!props.items.length) {\n return false;\n }\n\n let newCommandIndex = selectedCommandIndex - 1;\n let newGroupIndex = selectedGroupIndex;\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1;\n newCommandIndex =\n props.items[newGroupIndex]?.commands.length - 1 || 0;\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = props.items.length - 1;\n newCommandIndex = props.items[newGroupIndex].commands.length - 1;\n }\n\n setSelectedCommandIndex(newCommandIndex);\n setSelectedGroupIndex(newGroupIndex);\n\n return true;\n }\n\n if (event.key === \"Enter\") {\n if (\n !props.items.length ||\n selectedGroupIndex === -1 ||\n selectedCommandIndex === -1\n ) {\n return false;\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex);\n\n return true;\n }\n\n return false;\n },\n }));\n\n useEffect(() => {\n if (activeItem.current && scrollContainer.current) {\n const offsetTop = activeItem.current.offsetTop;\n const offsetHeight = activeItem.current.offsetHeight;\n\n scrollContainer.current.scrollTop = offsetTop - offsetHeight;\n }\n }, [selectedCommandIndex, selectedGroupIndex]);\n\n const createCommandClickHandler = useCallback(\n (groupIndex: number, commandIndex: number) => {\n return () => {\n selectItem(groupIndex, commandIndex);\n };\n },\n [selectItem]\n );\n\n if (!props.items.length) {\n return null;\n }\n\n return (\n <Surface\n ref={scrollContainer}\n className=\"text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-2\"\n >\n <div className=\"grid grid-cols-1 gap-0.5\">\n {props.items.map((group, groupIndex: number) => (\n <React.Fragment key={`${group.title}-wrapper`}>\n <div\n className=\"text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-4 font-semibold tracking-wider select-none uppercase first:mt-0.5\"\n key={`${group.title}`}\n >\n {group.title}\n </div>\n {group.commands.map((command: Command, commandIndex: number) => (\n <DropdownButton\n key={`${command.label}`}\n isActive={\n selectedGroupIndex === groupIndex &&\n selectedCommandIndex === commandIndex\n }\n onClick={createCommandClickHandler(groupIndex, commandIndex)}\n >\n <Icon icon={command.icon} className=\"mr-1\" />\n {command.label}\n </DropdownButton>\n ))}\n </React.Fragment>\n ))}\n </div>\n </Surface>\n );\n});\n\nAIMenuList.displayName = \"AIMenuList\";\n\nexport default AIMenuList;\n"],"names":["React","useCallback","useEffect","useRef","useState","DropdownButton","Surface","Icon","AIMenuList","forwardRef","props","ref","scrollContainer","activeItem","selectedGroupIndex","setSelectedGroupIndex","selectedCommandIndex","setSelectedCommandIndex","items","selectItem","groupIndex","commandIndex","command","commands","useImperativeHandle","onKeyDown","event","key","length","newCommandIndex","newGroupIndex","current","offsetTop","offsetHeight","scrollTop","createCommandClickHandler","className","div","map","group","Fragment","title","isActive","onClick","icon","label","displayName"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { LucideIcon } from "lucide-react";
2
+ export type CommandButtonProps = {
3
+ active?: boolean;
4
+ description: string;
5
+ icon: LucideIcon;
6
+ onClick: () => void;
7
+ title: string;
8
+ };
9
+ export declare const CommandButton: import("react").ForwardRefExoticComponent<CommandButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
10
+ //# sourceMappingURL=CommandButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandButton.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/CommandButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,aAAa,kHAsBzB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { Icon } from "../../features/ui/Icon.js";
4
+ import { cn } from "../../lib/utils/index.js";
5
+ export const CommandButton = /*#__PURE__*/ forwardRef(({ active, icon, onClick, title }, ref)=>{
6
+ const wrapperClass = cn("flex text-neutral-500 items-center text-xs font-semibold justify-start p-1.5 gap-2 rounded", !active && "bg-transparent hover:bg-neutral-50 hover:text-black", active && "bg-neutral-100 text-black hover:bg-neutral-100");
7
+ return /*#__PURE__*/ _jsxs("button", {
8
+ type: "button",
9
+ ref: ref,
10
+ onClick: onClick,
11
+ className: wrapperClass,
12
+ children: [
13
+ /*#__PURE__*/ _jsx(Icon, {
14
+ icon: icon,
15
+ className: "w-3 h-3"
16
+ }),
17
+ /*#__PURE__*/ _jsx("div", {
18
+ className: "flex flex-col items-start justify-start",
19
+ children: /*#__PURE__*/ _jsx("div", {
20
+ className: "text-sm font-medium",
21
+ children: title
22
+ })
23
+ })
24
+ ]
25
+ });
26
+ });
27
+ CommandButton.displayName = "CommandButton";
28
+
29
+ //# sourceMappingURL=CommandButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/CommandButton.tsx"],"sourcesContent":["import { LucideIcon } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport { Icon } from \"../../features/ui/Icon.js\";\nimport { cn } from \"../../lib/utils/index.js\";\n\nexport type CommandButtonProps = {\n active?: boolean;\n description: string;\n icon: LucideIcon;\n onClick: () => void;\n title: string;\n};\n\nexport const CommandButton = forwardRef<HTMLButtonElement, CommandButtonProps>(\n ({ active, icon, onClick, title }, ref) => {\n const wrapperClass = cn(\n \"flex text-neutral-500 items-center text-xs font-semibold justify-start p-1.5 gap-2 rounded\",\n !active && \"bg-transparent hover:bg-neutral-50 hover:text-black\",\n active && \"bg-neutral-100 text-black hover:bg-neutral-100\"\n );\n\n return (\n <button\n type=\"button\"\n ref={ref}\n onClick={onClick}\n className={wrapperClass}\n >\n <Icon icon={icon} className=\"w-3 h-3\" />\n <div className=\"flex flex-col items-start justify-start\">\n <div className=\"text-sm font-medium\">{title}</div>\n </div>\n </button>\n );\n }\n);\n\nCommandButton.displayName = \"CommandButton\";\n"],"names":["forwardRef","Icon","cn","CommandButton","active","icon","onClick","title","ref","wrapperClass","button","type","className","div","displayName"],"mappings":";AACA,SAASA,UAAU,QAAQ,QAAQ;AACnC,SAASC,IAAI,QAAQ,4BAA4B;AACjD,SAASC,EAAE,QAAQ,2BAA2B;AAU9C,OAAO,MAAMC,8BAAgBH,WAC3B,CAAC,EAAEI,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,KAAK,EAAE,EAAEC;IACjC,MAAMC,eAAeP,GACnB,8FACA,CAACE,UAAU,uDACXA,UAAU;IAGZ,qBACE,MAACM;QACCC,MAAK;QACLH,KAAKA;QACLF,SAASA;QACTM,WAAWH;;0BAEX,KAACR;gBAAKI,MAAMA;gBAAMO,WAAU;;0BAC5B,KAACC;gBAAID,WAAU;0BACb,cAAA,KAACC;oBAAID,WAAU;8BAAuBL;;;;;AAI9C,GACA;AAEFJ,cAAcW,WAAW,GAAG"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import { MenuListProps } from "./types.js";
3
+ export declare const MenuList: React.ForwardRefExoticComponent<MenuListProps & React.RefAttributes<unknown>>;
4
+ export default MenuList;
5
+ //# sourceMappingURL=MenuList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuList.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/AICommand/MenuList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,EAAW,aAAa,EAAE,MAAM,YAAY,CAAC;AAIpD,eAAO,MAAM,QAAQ,+EAiJnB,CAAC;AAIH,eAAe,QAAQ,CAAC"}