@gravity-ui/markdown-editor 15.14.0 → 15.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/build/cjs/bundle/MarkupEditorView.js +1 -1
  2. package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
  3. package/build/cjs/bundle/WysiwygEditorView.js +1 -1
  4. package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
  5. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.d.ts +1 -0
  6. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -3
  7. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  8. package/build/cjs/bundle/toolbar/ToolbarSelect.js +2 -2
  9. package/build/cjs/bundle/toolbar/ToolbarSelect.js.map +1 -1
  10. package/build/cjs/bundle/toolbar/custom/ToolbarColors.js +1 -1
  11. package/build/cjs/bundle/toolbar/custom/ToolbarColors.js.map +1 -1
  12. package/build/cjs/bundle/toolbar/wysiwyg/WToolbarTextSelect.js +1 -1
  13. package/build/cjs/bundle/toolbar/wysiwyg/WToolbarTextSelect.js.map +1 -1
  14. package/build/cjs/extensions/additional/GPT/GptDialog/GptDialog.js +5 -2
  15. package/build/cjs/extensions/additional/GPT/GptDialog/GptDialog.js.map +1 -1
  16. package/build/cjs/extensions/additional/GPT/plugin.js +1 -1
  17. package/build/cjs/extensions/additional/GPT/plugin.js.map +1 -1
  18. package/build/cjs/extensions/behavior/CommandMenu/component.js +1 -1
  19. package/build/cjs/extensions/behavior/CommandMenu/component.js.map +1 -1
  20. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +1 -0
  21. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  22. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.js +1 -1
  23. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.js.map +1 -1
  24. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.js +1 -1
  25. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.js.map +1 -1
  26. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +1 -1
  27. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
  28. package/build/cjs/toolbar/FlexToolbar.js +1 -1
  29. package/build/cjs/toolbar/FlexToolbar.js.map +1 -1
  30. package/build/cjs/toolbar/Toolbar.d.ts +1 -1
  31. package/build/cjs/toolbar/Toolbar.js +2 -2
  32. package/build/cjs/toolbar/Toolbar.js.map +1 -1
  33. package/build/cjs/toolbar/ToolbarGroup.js +1 -1
  34. package/build/cjs/toolbar/ToolbarGroup.js.map +1 -1
  35. package/build/cjs/toolbar/ToolbarListButton.d.ts +2 -1
  36. package/build/cjs/toolbar/ToolbarListButton.js +4 -3
  37. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  38. package/build/cjs/version.js +1 -1
  39. package/build/cjs/version.js.map +1 -1
  40. package/build/cjs/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js +1 -1
  41. package/build/cjs/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js.map +1 -1
  42. package/build/esm/bundle/MarkupEditorView.js +1 -1
  43. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  44. package/build/esm/bundle/WysiwygEditorView.js +1 -1
  45. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  46. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.d.ts +1 -0
  47. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -3
  48. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  49. package/build/esm/bundle/toolbar/ToolbarSelect.js +2 -2
  50. package/build/esm/bundle/toolbar/ToolbarSelect.js.map +1 -1
  51. package/build/esm/bundle/toolbar/custom/ToolbarColors.js +1 -1
  52. package/build/esm/bundle/toolbar/custom/ToolbarColors.js.map +1 -1
  53. package/build/esm/bundle/toolbar/wysiwyg/WToolbarTextSelect.js +1 -1
  54. package/build/esm/bundle/toolbar/wysiwyg/WToolbarTextSelect.js.map +1 -1
  55. package/build/esm/extensions/additional/GPT/GptDialog/GptDialog.js +6 -3
  56. package/build/esm/extensions/additional/GPT/GptDialog/GptDialog.js.map +1 -1
  57. package/build/esm/extensions/additional/GPT/plugin.js +1 -1
  58. package/build/esm/extensions/additional/GPT/plugin.js.map +1 -1
  59. package/build/esm/extensions/behavior/CommandMenu/component.js +1 -1
  60. package/build/esm/extensions/behavior/CommandMenu/component.js.map +1 -1
  61. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +1 -0
  62. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  63. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.js +1 -1
  64. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.js.map +1 -1
  65. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.js +1 -1
  66. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.js.map +1 -1
  67. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +1 -1
  68. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
  69. package/build/esm/toolbar/FlexToolbar.js +1 -1
  70. package/build/esm/toolbar/FlexToolbar.js.map +1 -1
  71. package/build/esm/toolbar/Toolbar.d.ts +1 -1
  72. package/build/esm/toolbar/Toolbar.js +2 -2
  73. package/build/esm/toolbar/Toolbar.js.map +1 -1
  74. package/build/esm/toolbar/ToolbarGroup.js +1 -1
  75. package/build/esm/toolbar/ToolbarGroup.js.map +1 -1
  76. package/build/esm/toolbar/ToolbarListButton.d.ts +2 -1
  77. package/build/esm/toolbar/ToolbarListButton.js +4 -3
  78. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  79. package/build/esm/version.js +1 -1
  80. package/build/esm/version.js.map +1 -1
  81. package/build/esm/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js +1 -1
  82. package/build/esm/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButtonWithPopupMenu.js","sourceRoot":"../../../../src","sources":["bundle/toolbar/ToolbarButtonWithPopupMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACH,aAAa,EACb,MAAM,EACN,IAAI,EAEJ,IAAI,EACJ,KAAK,GAER,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,EAAE,EAAC,2BAAwB;AAEnC,OAAO,EAAC,OAAO,EAAE,UAAU,EAAC,wBAAqB;AACjD,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,mCAAgC;AACzE,OAAO,EAA8C,mBAAmB,EAAC,+BAAsB;AAE/F,0CAA2C;AAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,gCAAgC,CAAC,CAAC;AA2B/C,MAAM,CAAC,MAAM,0BAA0B,GAA8C,CAAC,EAClF,aAAa,EACb,SAAS,EACT,KAAK,EACL,OAAO,EACP,IAAI,EACJ,aAAa,EACb,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,cAAc,GACjB,EAAE,EAAE;IACD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,AAAD,EAAG,IAAI,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAClB,GAAG,EAAE,CACD,OAAO,CACH,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAC,CAAC,CAAC,EACpD,OAAO,CACV,EACL,CAAC,SAAS,CAAC,CACd,CAAC;IAEF,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAC7B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,CAClE,CAAC;IACF,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,CAAC;IAElF,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;IAC3C,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,eAAe,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;QACX,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAE5B,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GACxB,cAAc,KAAK,OAAO;QACtB,CAAC,CAAE;YACG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;YAC1D,SAAS,IAAI,UAAU;SAChB;QACb,CAAC,CAAE,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAW,CAAC;IAE/E,OAAO,CACH,8BACI,KAAC,aAAa,IACV,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,mBAAmB,CAAC,IAAI,EACnC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EACrC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,YAE1C,MAAC,MAAM,IACH,IAAI,EAAC,GAAG,EACR,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAC/B,OAAO,EAAE,UAAU,aAEnB,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,GAAI,EACnE,EAAE,EACH,KAAC,IAAI,IAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,GAAI,IACvD,GACG,EAChB,KAAC,KAAK,IACF,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;oBACnB,IAAI,CAAC,IAAI;wBAAE,IAAI,EAAE,CAAC;gBACtB,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAC,GAAG,YACT,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE;wBAChD,OAAO,CACH,KAAC,IAAI,CAAC,KAAK,IAAC,KAAK,EAAE,KAAK,EAAY,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,YACzD,KAAK,CAAC,GAAG,CACN,CAAC,EAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAC,EAAE,EAAE,CAAC,CACxD,KAAC,IAAI,CAAC,IAAI,IAEN,SAAS,EACL,KAAC,IAAI,IACD,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,aAAa,GAC1B,EAEN,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAC5B,OAAO,EAAE,GAAG,EAAE;oCACV,IAAI,EAAE,CAAC;oCACP,KAAK,EAAE,CAAC;oCACR,MAAM,CAAC,GAAG,EAAE,CAAC;oCACb,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gCAClB,CAAC,EACD,UAAU,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC,YAE/B,IAAI,IAlBA,EAAE,CAmBC,CACf,CACJ,IAzB0B,GAAG,CA0BrB,CAChB,CAAC;oBACN,CAAC,CAAC,GACC,GACH,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useEffect, useMemo} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {\n ActionTooltip,\n Button,\n Icon,\n type IconProps,\n Menu,\n Popup,\n type PopupProps,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../classname';\nimport type {Action} from '../../core';\nimport {groupBy, isFunction} from '../../lodash';\nimport {useBooleanState, useElementState} from '../../react-utils/hooks';\nimport {type ToolbarBaseProps, type ToolbarIconData, ToolbarTooltipDelay} from '../../toolbar';\n\nimport './ToolbarButtonWithPopupMenu.scss';\nconst b = cn('toolbar-button-with-popup-menu');\n\nexport type MenuItem = {\n id: string;\n action: Action;\n icon: IconProps['data'];\n text: string;\n iconSize?: IconProps['size'];\n iconClassname?: string;\n group?: string;\n ignoreActive?: boolean;\n};\n\nexport type ToolbarButtonWithPopupMenuProps = Omit<\n ToolbarBaseProps<never> &\n Pick<PopupProps, 'disablePortal'> & {\n icon: ToolbarIconData;\n iconClassName?: string;\n chevronIconClassName?: string;\n title: string | (() => string);\n menuItems: MenuItem[];\n /** @default 'classic' */\n _selectionType?: 'classic' | 'light';\n },\n 'editor'\n>;\n\nexport const ToolbarButtonWithPopupMenu: React.FC<ToolbarButtonWithPopupMenuProps> = ({\n disablePortal,\n className,\n focus,\n onClick,\n icon,\n iconClassName,\n chevronIconClassName,\n title,\n menuItems,\n _selectionType,\n}) => {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const groups = useMemo(\n () =>\n groupBy(\n menuItems.map((i) => ({...i, group: i.group || ''})),\n 'group',\n ),\n [menuItems],\n );\n\n const someActive = menuItems.some(\n (item) => !item.ignoreActive && item.action.isActive() === true,\n );\n const everyDisabled = menuItems.every((item) => item.action.isEnable() === false);\n\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n const [btnView, btnSelected] =\n _selectionType === 'light'\n ? ([\n popupOpen ? 'normal' : someActive ? 'flat-action' : 'flat',\n popupOpen && someActive,\n ] as const)\n : ([someActive || popupOpen ? 'normal' : 'flat', someActive] as const);\n\n return (\n <>\n <ActionTooltip\n disabled={popupOpen}\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n title={isFunction(title) ? title() : title}\n >\n <Button\n size=\"m\"\n ref={setAnchorElement}\n view={btnView}\n selected={btnSelected}\n disabled={everyDisabled}\n className={b(null, [className])}\n onClick={toggleOpen}\n >\n <Icon data={icon.data} size={icon.size} className={iconClassName} />\n {''}\n <Icon data={ChevronDown} className={chevronIconClassName} />\n </Button>\n </ActionTooltip>\n <Popup\n open={popupOpen}\n disablePortal={disablePortal}\n anchorElement={anchorElement}\n onOpenChange={(open) => {\n if (!open) hide();\n }}\n >\n <Menu size=\"l\">\n {Object.entries(groups).map(([label, items], key) => {\n return (\n <Menu.Group label={label} key={key} className={b('menu-group')}>\n {items.map(\n ({id, icon, iconSize = 16, action, text, iconClassname}) => (\n <Menu.Item\n key={id}\n iconStart={\n <Icon\n data={icon}\n size={iconSize}\n className={iconClassname}\n />\n }\n active={action.isActive()}\n disabled={!action.isEnable()}\n onClick={() => {\n hide();\n focus();\n action.run();\n onClick?.(id);\n }}\n extraProps={{'aria-label': text}}\n >\n {text}\n </Menu.Item>\n ),\n )}\n </Menu.Group>\n );\n })}\n </Menu>\n </Popup>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"ToolbarButtonWithPopupMenu.js","sourceRoot":"../../../../src","sources":["bundle/toolbar/ToolbarButtonWithPopupMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {\n ActionTooltip,\n Button,\n Icon,\n type IconProps,\n Menu,\n Popup,\n type PopupProps,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../classname';\nimport type {Action} from '../../core';\nimport {groupBy, isFunction} from '../../lodash';\nimport {useBooleanState, useElementState} from '../../react-utils/hooks';\nimport {type ToolbarBaseProps, type ToolbarIconData, ToolbarTooltipDelay} from '../../toolbar';\n\nimport './ToolbarButtonWithPopupMenu.scss';\nconst b = cn('toolbar-button-with-popup-menu');\n\nexport type MenuItem = {\n id: string;\n action: Action;\n icon: IconProps['data'];\n text: string;\n iconSize?: IconProps['size'];\n iconClassname?: string;\n group?: string;\n ignoreActive?: boolean;\n};\n\nexport type ToolbarButtonWithPopupMenuProps = Omit<\n ToolbarBaseProps<never> &\n Pick<PopupProps, 'disablePortal'> & {\n icon: ToolbarIconData;\n iconClassName?: string;\n chevronIconClassName?: string;\n title: string | (() => string);\n menuItems: MenuItem[];\n /** @default 'classic' */\n _selectionType?: 'classic' | 'light';\n qaMenu?: string;\n },\n 'editor'\n>;\n\nexport const ToolbarButtonWithPopupMenu: React.FC<ToolbarButtonWithPopupMenuProps> = ({\n disablePortal,\n className,\n focus,\n onClick,\n icon,\n iconClassName,\n chevronIconClassName,\n title,\n menuItems,\n _selectionType,\n qa,\n qaMenu,\n ...props\n}) => {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const groups = useMemo(\n () =>\n groupBy(\n menuItems.map((i) => ({...i, group: i.group || ''})),\n 'group',\n ),\n [menuItems],\n );\n\n const someActive = menuItems.some(\n (item) => !item.ignoreActive && item.action.isActive() === true,\n );\n const everyDisabled = menuItems.every((item) => item.action.isEnable() === false);\n\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n const [btnView, btnSelected] =\n _selectionType === 'light'\n ? ([\n popupOpen ? 'normal' : someActive ? 'flat-action' : 'flat',\n popupOpen && someActive,\n ] as const)\n : ([someActive || popupOpen ? 'normal' : 'flat', someActive] as const);\n\n const textTitle = isFunction(title) ? title() : title;\n\n return (\n <>\n <ActionTooltip\n disabled={popupOpen}\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n title={textTitle}\n >\n <Button\n size=\"m\"\n ref={setAnchorElement}\n view={btnView}\n selected={btnSelected}\n disabled={everyDisabled}\n className={b(null, [className])}\n onClick={toggleOpen}\n aria-label={textTitle}\n qa={qa}\n {...props}\n >\n <Icon data={icon.data} size={icon.size} className={iconClassName} />\n {''}\n <Icon data={ChevronDown} className={chevronIconClassName} />\n </Button>\n </ActionTooltip>\n <Popup\n open={popupOpen}\n disablePortal={disablePortal}\n anchorElement={anchorElement}\n onOpenChange={(open) => {\n if (!open) hide();\n }}\n >\n <Menu size=\"l\" qa={qaMenu} data-toolbar-menu-for={textTitle}>\n {Object.entries(groups).map(([label, items], key) => {\n return (\n <Menu.Group label={label} key={key} className={b('menu-group')}>\n {items.map(\n ({id, icon, iconSize = 16, action, text, iconClassname}) => (\n <Menu.Item\n key={id}\n iconStart={\n <Icon\n data={icon}\n size={iconSize}\n className={iconClassname}\n />\n }\n active={action.isActive()}\n disabled={!action.isEnable()}\n onClick={() => {\n hide();\n focus();\n action.run();\n onClick?.(id);\n }}\n extraProps={{'aria-label': text}}\n >\n {text}\n </Menu.Item>\n ),\n )}\n </Menu.Group>\n );\n })}\n </Menu>\n </Popup>\n </>\n );\n};\n"]}
@@ -5,9 +5,9 @@ import { isFunction } from "../../lodash.js";
5
5
  import { PreviewTooltip } from "../../toolbar/PreviewTooltip.js";
6
6
  import "./ToolbarSelect.css";
7
7
  const b = cn('toolbar-select');
8
- export const ToolbarSelect = ({ disablePortal, className, editor, focus, onClick, items, }) => {
8
+ export const ToolbarSelect = ({ disablePortal, className, editor, focus, onClick, items, qa, }) => {
9
9
  const activeItem = items.find((item) => item.isActive(editor));
10
- return (_jsx(_Fragment, { children: _jsx(Select, { size: "m", view: "clear", className: className, disablePortal: disablePortal, onOpenChange: focus, value: activeItem ? [activeItem.id] : undefined, options: items.map((item) => ({
10
+ return (_jsx(_Fragment, { children: _jsx(Select, { qa: qa, size: "m", view: "clear", className: className, disablePortal: disablePortal, onOpenChange: focus, value: activeItem ? [activeItem.id] : undefined, options: items.map((item) => ({
11
11
  data: item,
12
12
  value: item.id,
13
13
  text: isFunction(item.title) ? item.title() : item.title,
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarSelect.js","sourceRoot":"../../../../src","sources":["bundle/toolbar/ToolbarSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,EACH,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,MAAM,GAGT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,EAAE,EAAC,2BAAwB;AACnC,OAAO,EAAC,UAAU,EAAC,wBAAqB;AACxC,OAAO,EAAC,cAAc,EAAC,wCAAqC;AAI5D,6BAA8B;AAE9B,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAO/B,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EACxD,aAAa,EACb,SAAS,EACT,MAAM,EACN,KAAK,EACL,OAAO,EACP,KAAK,GACR,EAAE,EAAE;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/D,OAAO,CACH,4BACI,KAAC,MAAM,IACH,IAAI,EAAC,GAAG,EACR,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,KAAK,EACnB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAC/C,OAAO,EAAE,KAAK,CAAC,GAAG,CAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,CAAC,EAAE;gBACd,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;aAC3D,CAAC,CAAC,EACH,YAAY,EAAE,CAAC,EAAC,IAAI,EAAE,IAAI,EAAC,EAAE,EAAE;gBAC3B,MAAM,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,GAAG,IAAwB,CAAC;gBAC/D,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClD,OAAO,CACH,KAAC,cAAc,IAAC,OAAO,EAAE,OAAO,YAC5B,6BAAiB,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,aACvC,cAAK,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,YAC1B,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,GAAI,GAC1D,EACN,eAAK,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,aAC5B,IAAI,EACL,eAAK,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,aAC1B,MAAM,IAAI,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,GAAI,EACnC,QAAQ,IAAI,CACT,KAAC,QAAQ,IACL,YAAY,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,EAC5B,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,YAExB,QAAQ,GACF,CACd,IACC,IACJ,IACJ,GACO,CACpB,CAAC;YACN,CAAC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACf,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBACd,KAAK,EAAE,CAAC;YACZ,CAAC,GACH,GACH,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {\n HelpMark,\n Hotkey,\n Icon,\n Select,\n type SelectOption,\n type SelectProps,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../classname';\nimport {isFunction} from '../../lodash';\nimport {PreviewTooltip} from '../../toolbar/PreviewTooltip';\n\nimport type {WToolbarBaseProps, WToolbarItemData} from './types';\n\nimport './ToolbarSelect.scss';\n\nconst b = cn('toolbar-select');\n\nexport type ToolbarSelectProps = WToolbarBaseProps &\n Pick<SelectProps, 'disablePortal'> & {\n items: WToolbarItemData[];\n };\n\nexport const ToolbarSelect: React.FC<ToolbarSelectProps> = ({\n disablePortal,\n className,\n editor,\n focus,\n onClick,\n items,\n}) => {\n const activeItem = items.find((item) => item.isActive(editor));\n\n return (\n <>\n <Select\n size=\"m\"\n view=\"clear\"\n className={className}\n disablePortal={disablePortal}\n onOpenChange={focus}\n value={activeItem ? [activeItem.id] : undefined}\n options={items.map<SelectOption>((item) => ({\n data: item,\n value: item.id,\n text: isFunction(item.title) ? item.title() : item.title,\n }))}\n renderOption={({text, data}) => {\n const {icon, hotkey, hint, preview} = data as WToolbarItemData;\n const hintText = isFunction(hint) ? hint() : hint;\n return (\n <PreviewTooltip preview={preview}>\n <div aria-label={text} className={b('item')}>\n <div className={b('item-icon')}>\n <Icon data={icon.data} size={Number(icon.size ?? 16) + 2} />\n </div>\n <div className={b('item-content')}>\n {text}\n <div className={b('item-extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n popoverProps={{modal: false}}\n className={b('item-hint')}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n </div>\n </div>\n </PreviewTooltip>\n );\n }}\n onUpdate={([id]) => {\n items.find((item) => item.id === id)?.exec(editor);\n onClick?.(id);\n focus();\n }}\n />\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"ToolbarSelect.js","sourceRoot":"../../../../src","sources":["bundle/toolbar/ToolbarSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,EACH,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,MAAM,GAGT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,EAAE,EAAC,2BAAwB;AACnC,OAAO,EAAC,UAAU,EAAC,wBAAqB;AACxC,OAAO,EAAC,cAAc,EAAC,wCAAqC;AAI5D,6BAA8B;AAE9B,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAO/B,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EACxD,aAAa,EACb,SAAS,EACT,MAAM,EACN,KAAK,EACL,OAAO,EACP,KAAK,EACL,EAAE,GACL,EAAE,EAAE;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/D,OAAO,CACH,4BACI,KAAC,MAAM,IACH,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,GAAG,EACR,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,KAAK,EACnB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAC/C,OAAO,EAAE,KAAK,CAAC,GAAG,CAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,CAAC,EAAE;gBACd,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;aAC3D,CAAC,CAAC,EACH,YAAY,EAAE,CAAC,EAAC,IAAI,EAAE,IAAI,EAAC,EAAE,EAAE;gBAC3B,MAAM,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,GAAG,IAAwB,CAAC;gBAC/D,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClD,OAAO,CACH,KAAC,cAAc,IAAC,OAAO,EAAE,OAAO,YAC5B,6BAAiB,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,aACvC,cAAK,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,YAC1B,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,GAAI,GAC1D,EACN,eAAK,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,aAC5B,IAAI,EACL,eAAK,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,aAC1B,MAAM,IAAI,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,GAAI,EACnC,QAAQ,IAAI,CACT,KAAC,QAAQ,IACL,YAAY,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,EAC5B,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,YAExB,QAAQ,GACF,CACd,IACC,IACJ,IACJ,GACO,CACpB,CAAC;YACN,CAAC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACf,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBACd,KAAK,EAAE,CAAC;YACZ,CAAC,GACH,GACH,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {\n HelpMark,\n Hotkey,\n Icon,\n Select,\n type SelectOption,\n type SelectProps,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../classname';\nimport {isFunction} from '../../lodash';\nimport {PreviewTooltip} from '../../toolbar/PreviewTooltip';\n\nimport type {WToolbarBaseProps, WToolbarItemData} from './types';\n\nimport './ToolbarSelect.scss';\n\nconst b = cn('toolbar-select');\n\nexport type ToolbarSelectProps = WToolbarBaseProps &\n Pick<SelectProps, 'disablePortal'> & {\n items: WToolbarItemData[];\n };\n\nexport const ToolbarSelect: React.FC<ToolbarSelectProps> = ({\n disablePortal,\n className,\n editor,\n focus,\n onClick,\n items,\n qa,\n}) => {\n const activeItem = items.find((item) => item.isActive(editor));\n\n return (\n <>\n <Select\n qa={qa}\n size=\"m\"\n view=\"clear\"\n className={className}\n disablePortal={disablePortal}\n onOpenChange={focus}\n value={activeItem ? [activeItem.id] : undefined}\n options={items.map<SelectOption>((item) => ({\n data: item,\n value: item.id,\n text: isFunction(item.title) ? item.title() : item.title,\n }))}\n renderOption={({text, data}) => {\n const {icon, hotkey, hint, preview} = data as WToolbarItemData;\n const hintText = isFunction(hint) ? hint() : hint;\n return (\n <PreviewTooltip preview={preview}>\n <div aria-label={text} className={b('item')}>\n <div className={b('item-icon')}>\n <Icon data={icon.data} size={Number(icon.size ?? 16) + 2} />\n </div>\n <div className={b('item-content')}>\n {text}\n <div className={b('item-extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n popoverProps={{modal: false}}\n className={b('item-hint')}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n </div>\n </div>\n </PreviewTooltip>\n );\n }}\n onUpdate={([id]) => {\n items.find((item) => item.id === id)?.exec(editor);\n onClick?.(id);\n focus();\n }}\n />\n </>\n );\n};\n"]}
@@ -55,6 +55,6 @@ export const ToolbarColors = (props) => {
55
55
  },
56
56
  });
57
57
  }
58
- return (_jsx(ToolbarButtonWithPopupMenu, { ...props, title: i18n('colorify'), menuItems: items, icon: textColorIcon, _selectionType: "light", iconClassName: b('menu-icon', { color: currentColor }), chevronIconClassName: b('chevron-icon', { color: currentColor }) }));
58
+ return (_jsx(ToolbarButtonWithPopupMenu, { ...props, qaMenu: "g-md-toolbar-menu", title: i18n('colorify'), menuItems: items, icon: textColorIcon, _selectionType: "light", iconClassName: b('menu-icon', { color: currentColor }), chevronIconClassName: b('chevron-icon', { color: currentColor }), "data-selected-color": currentColor ?? 'default' }));
59
59
  };
60
60
  //# sourceMappingURL=ToolbarColors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarColors.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarColors.tsx"],"names":[],"mappings":"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","sourcesContent":["import {cn} from '../../../classname';\nimport {Colors} from '../../../extensions';\nimport {i18n} from '../../../i18n/menubar';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {icons} from '../../config/icons';\nimport {\n type MenuItem,\n ToolbarButtonWithPopupMenu,\n type ToolbarButtonWithPopupMenuProps,\n} from '../ToolbarButtonWithPopupMenu';\n\nimport './ToolbarColors.scss';\n\nconst b = cn('toolbar-colors');\nconst textColorIcon = icons.textColor;\n\nexport type ToolbarColorsProps = Omit<ToolbarBaseProps<never>, 'editor'> &\n Pick<ToolbarButtonWithPopupMenuProps, 'disablePortal'> & {\n active?: boolean;\n enable?: boolean;\n currentColor?: string;\n withDefault?: boolean;\n exec(color: string): void;\n };\n\nexport const ToolbarColors: React.FC<ToolbarColorsProps> = (props) => {\n const {exec, onClick, enable, currentColor, withDefault} = props;\n const isDefault = currentColor === undefined;\n\n const onItemClick = (color: string) => () => {\n // do not exec when current color is default and clicked to default item\n if (!(isDefault && color === '')) exec(color);\n onClick?.('colorify', {color: color === '' ? 'default' : color});\n };\n\n const items = [\n Colors.Gray,\n Colors.Yellow,\n Colors.Orange,\n Colors.Red,\n Colors.Green,\n Colors.Blue,\n Colors.Violet,\n ].map<MenuItem>((color) => ({\n id: color,\n icon: textColorIcon.data,\n iconSize: textColorIcon.size ?? 16,\n text: i18n(`colorify__color_${color}`),\n iconClassname: b('item-icon', {color}),\n action: {\n run: onItemClick(color),\n isEnable: () => Boolean(enable),\n isActive: () => color === currentColor,\n meta() {},\n },\n group: i18n(`colorify__group_text`),\n }));\n\n if (withDefault) {\n items.unshift({\n id: 'default',\n icon: textColorIcon.data,\n iconSize: textColorIcon.size ?? 16,\n text: i18n(`colorify__color_default`),\n iconClassname: b('item-icon', {color: 'default'}),\n group: i18n(`colorify__group_text`),\n ignoreActive: true,\n action: {\n run: onItemClick(''),\n isEnable: () => Boolean(enable),\n isActive: () => isDefault,\n meta() {},\n },\n });\n }\n\n return (\n <ToolbarButtonWithPopupMenu\n {...props}\n title={i18n('colorify')}\n menuItems={items}\n icon={textColorIcon}\n _selectionType=\"light\"\n iconClassName={b('menu-icon', {color: currentColor})}\n chevronIconClassName={b('chevron-icon', {color: currentColor})}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"ToolbarColors.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarColors.tsx"],"names":[],"mappings":"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","sourcesContent":["import {cn} from '../../../classname';\nimport {Colors} from '../../../extensions';\nimport {i18n} from '../../../i18n/menubar';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {icons} from '../../config/icons';\nimport {\n type MenuItem,\n ToolbarButtonWithPopupMenu,\n type ToolbarButtonWithPopupMenuProps,\n} from '../ToolbarButtonWithPopupMenu';\n\nimport './ToolbarColors.scss';\n\nconst b = cn('toolbar-colors');\nconst textColorIcon = icons.textColor;\n\nexport type ToolbarColorsProps = Omit<ToolbarBaseProps<never>, 'editor'> &\n Pick<ToolbarButtonWithPopupMenuProps, 'disablePortal'> & {\n active?: boolean;\n enable?: boolean;\n currentColor?: string;\n withDefault?: boolean;\n exec(color: string): void;\n };\n\nexport const ToolbarColors: React.FC<ToolbarColorsProps> = (props) => {\n const {exec, onClick, enable, currentColor, withDefault} = props;\n const isDefault = currentColor === undefined;\n\n const onItemClick = (color: string) => () => {\n // do not exec when current color is default and clicked to default item\n if (!(isDefault && color === '')) exec(color);\n onClick?.('colorify', {color: color === '' ? 'default' : color});\n };\n\n const items = [\n Colors.Gray,\n Colors.Yellow,\n Colors.Orange,\n Colors.Red,\n Colors.Green,\n Colors.Blue,\n Colors.Violet,\n ].map<MenuItem>((color) => ({\n id: color,\n icon: textColorIcon.data,\n iconSize: textColorIcon.size ?? 16,\n text: i18n(`colorify__color_${color}`),\n iconClassname: b('item-icon', {color}),\n action: {\n run: onItemClick(color),\n isEnable: () => Boolean(enable),\n isActive: () => color === currentColor,\n meta() {},\n },\n group: i18n(`colorify__group_text`),\n }));\n\n if (withDefault) {\n items.unshift({\n id: 'default',\n icon: textColorIcon.data,\n iconSize: textColorIcon.size ?? 16,\n text: i18n(`colorify__color_default`),\n iconClassname: b('item-icon', {color: 'default'}),\n group: i18n(`colorify__group_text`),\n ignoreActive: true,\n action: {\n run: onItemClick(''),\n isEnable: () => Boolean(enable),\n isActive: () => isDefault,\n meta() {},\n },\n });\n }\n\n return (\n <ToolbarButtonWithPopupMenu\n {...props}\n qaMenu=\"g-md-toolbar-menu\"\n title={i18n('colorify')}\n menuItems={items}\n icon={textColorIcon}\n _selectionType=\"light\"\n iconClassName={b('menu-icon', {color: currentColor})}\n chevronIconClassName={b('chevron-icon', {color: currentColor})}\n data-selected-color={currentColor ?? 'default'}\n />\n );\n};\n"]}
@@ -2,6 +2,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { wHeadingListConfig } from "../../config/w-heading-config.js";
3
3
  import { ToolbarSelect } from "../ToolbarSelect.js";
4
4
  export const WToolbarTextSelect = ({ focus, onClick, editor, className, disablePortal, }) => {
5
- return (_jsx(ToolbarSelect, { items: wHeadingListConfig.data, focus: focus, editor: editor, onClick: onClick, className: className, disablePortal: disablePortal }));
5
+ return (_jsx(ToolbarSelect, { qa: "g-md-toolbar-text-select", items: wHeadingListConfig.data, focus: focus, editor: editor, onClick: onClick, className: className, disablePortal: disablePortal }));
6
6
  };
7
7
  //# sourceMappingURL=WToolbarTextSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WToolbarTextSelect.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/wysiwyg/WToolbarTextSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,kBAAkB,EAAC,yCAAsC;AACjE,OAAO,EAAC,aAAa,EAA0B,4BAAyB;AAKxE,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EAClE,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,aAAa,GAChB,EAAE,EAAE;IACD,OAAO,CACH,KAAC,aAAa,IACV,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,GAC9B,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {wHeadingListConfig} from '../../config/w-heading-config';\nimport {ToolbarSelect, type ToolbarSelectProps} from '../ToolbarSelect';\nimport type {WToolbarBaseProps} from '../types';\n\nexport type WToolbarTextSelectProps = WToolbarBaseProps & Pick<ToolbarSelectProps, 'disablePortal'>;\n\nexport const WToolbarTextSelect: React.FC<WToolbarTextSelectProps> = ({\n focus,\n onClick,\n editor,\n className,\n disablePortal,\n}) => {\n return (\n <ToolbarSelect\n items={wHeadingListConfig.data}\n focus={focus}\n editor={editor}\n onClick={onClick}\n className={className}\n disablePortal={disablePortal}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"WToolbarTextSelect.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/wysiwyg/WToolbarTextSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,kBAAkB,EAAC,yCAAsC;AACjE,OAAO,EAAC,aAAa,EAA0B,4BAAyB;AAKxE,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EAClE,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,aAAa,GAChB,EAAE,EAAE;IACD,OAAO,CACH,KAAC,aAAa,IACV,EAAE,EAAC,0BAA0B,EAC7B,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,GAC9B,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {wHeadingListConfig} from '../../config/w-heading-config';\nimport {ToolbarSelect, type ToolbarSelectProps} from '../ToolbarSelect';\nimport type {WToolbarBaseProps} from '../types';\n\nexport type WToolbarTextSelectProps = WToolbarBaseProps & Pick<ToolbarSelectProps, 'disablePortal'>;\n\nexport const WToolbarTextSelect: React.FC<WToolbarTextSelectProps> = ({\n focus,\n onClick,\n editor,\n className,\n disablePortal,\n}) => {\n return (\n <ToolbarSelect\n qa=\"g-md-toolbar-text-select\"\n items={wHeadingListConfig.data}\n focus={focus}\n editor={editor}\n onClick={onClick}\n className={className}\n disablePortal={disablePortal}\n />\n );\n};\n"]}
@@ -1,11 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useCallback, useRef, useState } from 'react';
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
3
  import { ArrowRight, ArrowRotateLeft, ThumbsDown, ThumbsUp } from '@gravity-ui/icons';
4
4
  import { ActionTooltip, Alert, Button, Icon, TextInput } from '@gravity-ui/uikit';
5
5
  import { cn } from "../../../../classname.js";
6
6
  import { i18n } from "../../../../i18n/gpt/dialog/index.js";
7
7
  import gptIcon from "../../../../icons/GPT.js";
8
- import { useAutoFocus } from "../../../../react-utils/useAutoFocus.js";
9
8
  import { ErrorScreen } from "../ErrorScreen/ErrorScreen.js";
10
9
  import { IconRefuge } from "../IconRefuge/IconRefuge.js";
11
10
  import { PresetList } from "../PresetList/PresetList.js";
@@ -39,7 +38,11 @@ export const GptDialog = ({ markup, answerRender, promptPresets, disablePromptPr
39
38
  gptAlert?.onCloseGptAlert?.();
40
39
  setShowedGptAlert(false);
41
40
  }, [gptAlert]);
42
- useAutoFocus(customPromptContainerRef, [showAnswer]);
41
+ useEffect(() => {
42
+ if (customPromptContainerRef.current) {
43
+ customPromptContainerRef.current.focus();
44
+ }
45
+ }, [customPromptContainerRef.current]);
43
46
  useGptHotKeys(gptHotKeys.tryAgainGpt, handleTryAgain);
44
47
  useGptHotKeys(gptHotKeys.freshStartGpt, handleFreshStart);
45
48
  useGptHotKeys(gptHotKeys.applyResultGpt, handleApplyResult);
@@ -1 +1 @@
1
- {"version":3,"file":"GptDialog.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/GPT/GptDialog/GptDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useRef, useState} from 'react';\n\nimport {ArrowRight, ArrowRotateLeft, ThumbsDown, ThumbsUp} from '@gravity-ui/icons';\nimport {ActionTooltip, Alert, type AlertProps, Button, Icon, TextInput} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/gpt/dialog';\nimport gptIcon from '../../../../icons/GPT';\nimport {useAutoFocus} from '../../../../react-utils/useAutoFocus';\nimport {ErrorScreen} from '../ErrorScreen/ErrorScreen';\nimport type {CommonAnswer, GptRequestData, PromptPreset} from '../ErrorScreen/types';\nimport {IconRefuge} from '../IconRefuge/IconRefuge';\nimport {PresetList} from '../PresetList/PresetList';\nimport {gptHotKeys} from '../constants';\nimport {useGpt} from '../hooks/useGpt';\nimport {useGptHotKeys} from '../hooks/useGptHotKeys';\nimport {getAlertGptInfo, getDisableReplaceButtonText, getInputPlaceHolder} from '../utils';\n\nimport {LoadingScreen} from './LoadingScreen/LoadingScreen';\n\nimport './GptDialog.scss';\n\nexport type GptDialogProps<\n AnswerData extends CommonAnswer = CommonAnswer,\n PromptData extends unknown = unknown,\n> = {\n markup: string;\n answerRender: (data: AnswerData) => JSX.Element;\n onApplyResult: (markup: string) => void;\n promptPresets?: PromptPreset<PromptData>[];\n disablePromptPresets?: boolean;\n customPromptPlaceholder?: string;\n disabledPromptPlaceholder?: string;\n onCustomPromptApply?: (data: GptRequestData<PromptData>) => Promise<AnswerData | undefined>;\n onPromptPresetClick?: (data: GptRequestData<PromptData>) => Promise<AnswerData | undefined>;\n onTryAgain?: (data: GptRequestData<PromptData>) => Promise<AnswerData | undefined>;\n onLike?: (data: GptRequestData<PromptData>) => Promise<void>;\n onDislike?: (data: GptRequestData<PromptData>) => Promise<void>;\n onClose?: () => void;\n onUpdate?: (value: AnswerData | undefined) => void;\n gptAlertProps?: {\n showedGptAlert: boolean;\n onCloseGptAlert?: () => void;\n message?: string;\n theme?: AlertProps['theme'];\n className?: string;\n };\n};\n\nexport const cnGptDialog = cn('gpt-dialog');\n\nexport const GptDialog = <\n AnswerData extends CommonAnswer = CommonAnswer,\n PromptData extends unknown = unknown,\n>({\n markup,\n answerRender,\n promptPresets,\n disablePromptPresets,\n customPromptPlaceholder,\n disabledPromptPlaceholder,\n onCustomPromptApply,\n onPromptPresetClick,\n onTryAgain,\n onApplyResult,\n onClose,\n onLike,\n onDislike,\n onUpdate,\n gptAlertProps,\n}: GptDialogProps<AnswerData, PromptData>) => {\n const {\n answer,\n customPrompt,\n loading,\n mode,\n feedbackType,\n feedbackTypeLoading,\n handleLike,\n handleDislike,\n handleCustomPromptUpdate,\n handleCustomPromptKeyPress,\n handleCustomPromptApply,\n handlePresetClick,\n handleTryAgain,\n handleFreshStart,\n handleApplyResult,\n showAnswer,\n showError,\n showAnswerActions,\n showTryAgainButton,\n } = useGpt({\n markup,\n promptPresets,\n onLike,\n onDislike,\n onCustomPromptApply,\n onPromptPresetClick,\n onTryAgain,\n onApplyResult,\n onUpdate,\n });\n\n const gptAlert = gptAlertProps;\n\n const customPromptContainerRef = useRef<HTMLInputElement>(null);\n\n const [showedGptAlert, setShowedGptAlert] = useState(gptAlert?.showedGptAlert);\n\n const {alertMessage, alertTheme, alertClassName} = getAlertGptInfo(gptAlert);\n\n const onCloseAlert = useCallback(() => {\n if (gptAlert) {\n gptAlert.showedGptAlert = false;\n }\n gptAlert?.onCloseGptAlert?.();\n\n setShowedGptAlert(false);\n }, [gptAlert]);\n\n useAutoFocus(customPromptContainerRef, [showAnswer]);\n\n useGptHotKeys(gptHotKeys.tryAgainGpt, handleTryAgain);\n useGptHotKeys(gptHotKeys.freshStartGpt, handleFreshStart);\n useGptHotKeys(gptHotKeys.applyResultGpt, handleApplyResult);\n\n const replaceButtonText = getDisableReplaceButtonText(disablePromptPresets);\n\n const inputPlaceholderText = getInputPlaceHolder(\n disablePromptPresets,\n disabledPromptPlaceholder,\n customPromptPlaceholder,\n );\n\n const tryAgainButton = (\n <ActionTooltip hotkey={gptHotKeys.tryAgainGpt} title={i18n('try-again')}>\n <Button\n className={cnGptDialog('try-again-button')}\n view=\"normal\"\n size=\"m\"\n onClick={handleTryAgain}\n >\n <Icon data={ArrowRotateLeft} size={16} />\n {i18n('try-again')}\n </Button>\n </ActionTooltip>\n );\n\n let content = null;\n\n if (loading) {\n content = <LoadingScreen />;\n } else if (showError) {\n content = <ErrorScreen onRetry={handleTryAgain} onStartAgain={handleFreshStart} />;\n } else {\n content = (\n <>\n <div className={cnGptDialog('header')}>\n <div className={cnGptDialog('header-top')}>\n <IconRefuge\n containerClassName={cnGptDialog('gpt-icon')}\n data={gptIcon}\n refugeSize={28}\n size={16}\n />\n {(mode === 'only-custom' || mode === 'custom-and-presets') &&\n (showAnswer ? (\n <span className={cnGptDialog('answer-title')}>\n {i18n('answer-title')}\n </span>\n ) : (\n <div className={cnGptDialog('custom-prompt')}>\n <TextInput\n controlRef={customPromptContainerRef}\n view=\"clear\"\n size=\"m\"\n className={cnGptDialog('custom-prompt-input')}\n placeholder={inputPlaceholderText}\n onKeyPress={handleCustomPromptKeyPress}\n onUpdate={handleCustomPromptUpdate}\n />\n <Button\n className={cnGptDialog('custom-prompt-ask-button')}\n view=\"normal\"\n size=\"s\"\n disabled={!customPrompt}\n onClick={handleCustomPromptApply}\n >\n <Icon data={ArrowRight} size={16} />\n </Button>\n </div>\n ))}\n {mode === 'only-presets' && (\n <div className={cnGptDialog('alone-presets')}>\n <span className={cnGptDialog('alone-presets-text')}>\n {i18n('only-presets-title')}\n </span>\n </div>\n )}\n </div>\n {(mode === 'custom-and-presets' || mode === 'only-presets') &&\n ((showTryAgainButton && (\n <div className={cnGptDialog('header-bottom')}>\n {tryAgainButton}\n <ActionTooltip\n title={i18n('fresh-start-button')}\n hotkey={gptHotKeys.freshStartGpt}\n >\n <Button\n className={cnGptDialog('back-to-start')}\n view=\"normal\"\n size=\"m\"\n onClick={handleFreshStart}\n >\n {i18n('fresh-start-button')}\n </Button>\n </ActionTooltip>\n </div>\n )) ||\n (!disablePromptPresets && (\n <div className={cnGptDialog('header-bottom')}>\n <PresetList\n disablePromptPresets={disablePromptPresets}\n promptPresets={promptPresets}\n onPresetClick={handlePresetClick}\n />\n </div>\n )) ||\n (disablePromptPresets && showedGptAlert && (\n <Alert\n theme={alertTheme}\n message={alertMessage}\n align=\"center\"\n className={cnGptDialog('description-alert', alertClassName)}\n onClose={onCloseAlert}\n />\n )))}\n </div>\n {showAnswer && (\n <>\n <div className={cnGptDialog('body')}>\n <div className={cnGptDialog('answer')}>{answerRender(answer!)}</div>\n </div>\n <div className={cnGptDialog('footer')}>\n {showAnswerActions && (\n <div className={cnGptDialog('answer-actions')}>\n <Button\n className={cnGptDialog('like-button')}\n view=\"normal\"\n size=\"m\"\n onClick={handleLike}\n selected={feedbackType === 'like'}\n loading={feedbackTypeLoading === 'like'}\n >\n <Icon data={ThumbsUp} size={16} />\n </Button>\n <Button\n className={cnGptDialog('dislike-button')}\n view=\"normal\"\n size=\"m\"\n onClick={handleDislike}\n selected={feedbackType === 'dislike'}\n loading={feedbackTypeLoading === 'dislike'}\n >\n <Icon data={ThumbsDown} size={16} />\n </Button>\n {feedbackType && (\n <span className={cnGptDialog('feedback-message')}>\n {i18n('feedback-message')}\n </span>\n )}\n </div>\n )}\n <ActionTooltip\n title={i18n('close-button')}\n hotkey={gptHotKeys.closeGpt}\n >\n <Button\n className={cnGptDialog('close-button')}\n view=\"flat\"\n size=\"m\"\n onClick={onClose}\n >\n {i18n('close-button')}\n </Button>\n </ActionTooltip>\n <ActionTooltip\n title={replaceButtonText}\n hotkey={gptHotKeys.applyResultGpt}\n >\n <Button\n className={cnGptDialog('apply-button')}\n view=\"action\"\n size=\"m\"\n onClick={handleApplyResult}\n >\n {replaceButtonText}\n </Button>\n </ActionTooltip>\n </div>\n </>\n )}\n </>\n );\n }\n\n return <div className={cnGptDialog()}> {content} </div>;\n};\n"]}
1
+ {"version":3,"file":"GptDialog.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/GPT/GptDialog/GptDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useRef, useState} from 'react';\n\nimport {ArrowRight, ArrowRotateLeft, ThumbsDown, ThumbsUp} from '@gravity-ui/icons';\nimport {ActionTooltip, Alert, type AlertProps, Button, Icon, TextInput} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/gpt/dialog';\nimport gptIcon from '../../../../icons/GPT';\nimport {ErrorScreen} from '../ErrorScreen/ErrorScreen';\nimport type {CommonAnswer, GptRequestData, PromptPreset} from '../ErrorScreen/types';\nimport {IconRefuge} from '../IconRefuge/IconRefuge';\nimport {PresetList} from '../PresetList/PresetList';\nimport {gptHotKeys} from '../constants';\nimport {useGpt} from '../hooks/useGpt';\nimport {useGptHotKeys} from '../hooks/useGptHotKeys';\nimport {getAlertGptInfo, getDisableReplaceButtonText, getInputPlaceHolder} from '../utils';\n\nimport {LoadingScreen} from './LoadingScreen/LoadingScreen';\n\nimport './GptDialog.scss';\n\nexport type GptDialogProps<\n AnswerData extends CommonAnswer = CommonAnswer,\n PromptData extends unknown = unknown,\n> = {\n markup: string;\n answerRender: (data: AnswerData) => JSX.Element;\n onApplyResult: (markup: string) => void;\n promptPresets?: PromptPreset<PromptData>[];\n disablePromptPresets?: boolean;\n customPromptPlaceholder?: string;\n disabledPromptPlaceholder?: string;\n onCustomPromptApply?: (data: GptRequestData<PromptData>) => Promise<AnswerData | undefined>;\n onPromptPresetClick?: (data: GptRequestData<PromptData>) => Promise<AnswerData | undefined>;\n onTryAgain?: (data: GptRequestData<PromptData>) => Promise<AnswerData | undefined>;\n onLike?: (data: GptRequestData<PromptData>) => Promise<void>;\n onDislike?: (data: GptRequestData<PromptData>) => Promise<void>;\n onClose?: () => void;\n onUpdate?: (value: AnswerData | undefined) => void;\n gptAlertProps?: {\n showedGptAlert: boolean;\n onCloseGptAlert?: () => void;\n message?: string;\n theme?: AlertProps['theme'];\n className?: string;\n };\n};\n\nexport const cnGptDialog = cn('gpt-dialog');\n\nexport const GptDialog = <\n AnswerData extends CommonAnswer = CommonAnswer,\n PromptData extends unknown = unknown,\n>({\n markup,\n answerRender,\n promptPresets,\n disablePromptPresets,\n customPromptPlaceholder,\n disabledPromptPlaceholder,\n onCustomPromptApply,\n onPromptPresetClick,\n onTryAgain,\n onApplyResult,\n onClose,\n onLike,\n onDislike,\n onUpdate,\n gptAlertProps,\n}: GptDialogProps<AnswerData, PromptData>) => {\n const {\n answer,\n customPrompt,\n loading,\n mode,\n feedbackType,\n feedbackTypeLoading,\n handleLike,\n handleDislike,\n handleCustomPromptUpdate,\n handleCustomPromptKeyPress,\n handleCustomPromptApply,\n handlePresetClick,\n handleTryAgain,\n handleFreshStart,\n handleApplyResult,\n showAnswer,\n showError,\n showAnswerActions,\n showTryAgainButton,\n } = useGpt({\n markup,\n promptPresets,\n onLike,\n onDislike,\n onCustomPromptApply,\n onPromptPresetClick,\n onTryAgain,\n onApplyResult,\n onUpdate,\n });\n\n const gptAlert = gptAlertProps;\n\n const customPromptContainerRef = useRef<HTMLInputElement>(null);\n\n const [showedGptAlert, setShowedGptAlert] = useState(gptAlert?.showedGptAlert);\n\n const {alertMessage, alertTheme, alertClassName} = getAlertGptInfo(gptAlert);\n\n const onCloseAlert = useCallback(() => {\n if (gptAlert) {\n gptAlert.showedGptAlert = false;\n }\n gptAlert?.onCloseGptAlert?.();\n\n setShowedGptAlert(false);\n }, [gptAlert]);\n\n useEffect(() => {\n if (customPromptContainerRef.current) {\n customPromptContainerRef.current.focus();\n }\n }, [customPromptContainerRef.current]);\n\n useGptHotKeys(gptHotKeys.tryAgainGpt, handleTryAgain);\n useGptHotKeys(gptHotKeys.freshStartGpt, handleFreshStart);\n useGptHotKeys(gptHotKeys.applyResultGpt, handleApplyResult);\n\n const replaceButtonText = getDisableReplaceButtonText(disablePromptPresets);\n\n const inputPlaceholderText = getInputPlaceHolder(\n disablePromptPresets,\n disabledPromptPlaceholder,\n customPromptPlaceholder,\n );\n\n const tryAgainButton = (\n <ActionTooltip hotkey={gptHotKeys.tryAgainGpt} title={i18n('try-again')}>\n <Button\n className={cnGptDialog('try-again-button')}\n view=\"normal\"\n size=\"m\"\n onClick={handleTryAgain}\n >\n <Icon data={ArrowRotateLeft} size={16} />\n {i18n('try-again')}\n </Button>\n </ActionTooltip>\n );\n\n let content = null;\n\n if (loading) {\n content = <LoadingScreen />;\n } else if (showError) {\n content = <ErrorScreen onRetry={handleTryAgain} onStartAgain={handleFreshStart} />;\n } else {\n content = (\n <>\n <div className={cnGptDialog('header')}>\n <div className={cnGptDialog('header-top')}>\n <IconRefuge\n containerClassName={cnGptDialog('gpt-icon')}\n data={gptIcon}\n refugeSize={28}\n size={16}\n />\n {(mode === 'only-custom' || mode === 'custom-and-presets') &&\n (showAnswer ? (\n <span className={cnGptDialog('answer-title')}>\n {i18n('answer-title')}\n </span>\n ) : (\n <div className={cnGptDialog('custom-prompt')}>\n <TextInput\n controlRef={customPromptContainerRef}\n view=\"clear\"\n size=\"m\"\n className={cnGptDialog('custom-prompt-input')}\n placeholder={inputPlaceholderText}\n onKeyPress={handleCustomPromptKeyPress}\n onUpdate={handleCustomPromptUpdate}\n />\n <Button\n className={cnGptDialog('custom-prompt-ask-button')}\n view=\"normal\"\n size=\"s\"\n disabled={!customPrompt}\n onClick={handleCustomPromptApply}\n >\n <Icon data={ArrowRight} size={16} />\n </Button>\n </div>\n ))}\n {mode === 'only-presets' && (\n <div className={cnGptDialog('alone-presets')}>\n <span className={cnGptDialog('alone-presets-text')}>\n {i18n('only-presets-title')}\n </span>\n </div>\n )}\n </div>\n {(mode === 'custom-and-presets' || mode === 'only-presets') &&\n ((showTryAgainButton && (\n <div className={cnGptDialog('header-bottom')}>\n {tryAgainButton}\n <ActionTooltip\n title={i18n('fresh-start-button')}\n hotkey={gptHotKeys.freshStartGpt}\n >\n <Button\n className={cnGptDialog('back-to-start')}\n view=\"normal\"\n size=\"m\"\n onClick={handleFreshStart}\n >\n {i18n('fresh-start-button')}\n </Button>\n </ActionTooltip>\n </div>\n )) ||\n (!disablePromptPresets && (\n <div className={cnGptDialog('header-bottom')}>\n <PresetList\n disablePromptPresets={disablePromptPresets}\n promptPresets={promptPresets}\n onPresetClick={handlePresetClick}\n />\n </div>\n )) ||\n (disablePromptPresets && showedGptAlert && (\n <Alert\n theme={alertTheme}\n message={alertMessage}\n align=\"center\"\n className={cnGptDialog('description-alert', alertClassName)}\n onClose={onCloseAlert}\n />\n )))}\n </div>\n {showAnswer && (\n <>\n <div className={cnGptDialog('body')}>\n <div className={cnGptDialog('answer')}>{answerRender(answer!)}</div>\n </div>\n <div className={cnGptDialog('footer')}>\n {showAnswerActions && (\n <div className={cnGptDialog('answer-actions')}>\n <Button\n className={cnGptDialog('like-button')}\n view=\"normal\"\n size=\"m\"\n onClick={handleLike}\n selected={feedbackType === 'like'}\n loading={feedbackTypeLoading === 'like'}\n >\n <Icon data={ThumbsUp} size={16} />\n </Button>\n <Button\n className={cnGptDialog('dislike-button')}\n view=\"normal\"\n size=\"m\"\n onClick={handleDislike}\n selected={feedbackType === 'dislike'}\n loading={feedbackTypeLoading === 'dislike'}\n >\n <Icon data={ThumbsDown} size={16} />\n </Button>\n {feedbackType && (\n <span className={cnGptDialog('feedback-message')}>\n {i18n('feedback-message')}\n </span>\n )}\n </div>\n )}\n <ActionTooltip\n title={i18n('close-button')}\n hotkey={gptHotKeys.closeGpt}\n >\n <Button\n className={cnGptDialog('close-button')}\n view=\"flat\"\n size=\"m\"\n onClick={onClose}\n >\n {i18n('close-button')}\n </Button>\n </ActionTooltip>\n <ActionTooltip\n title={replaceButtonText}\n hotkey={gptHotKeys.applyResultGpt}\n >\n <Button\n className={cnGptDialog('apply-button')}\n view=\"action\"\n size=\"m\"\n onClick={handleApplyResult}\n >\n {replaceButtonText}\n </Button>\n </ActionTooltip>\n </div>\n </>\n )}\n </>\n );\n }\n\n return <div className={cnGptDialog()}> {content} </div>;\n};\n"]}
@@ -13,8 +13,8 @@ export const gptWidgetPlugin = (params) => {
13
13
  apply: (tr, decos) => {
14
14
  const meta = tr.getMeta(key);
15
15
  const paramsGpt = params;
16
- paramsGpt.disablePromptPresets = false;
17
16
  if (meta?.action === 'show') {
17
+ paramsGpt.disablePromptPresets = false;
18
18
  if (meta.to === meta.from) {
19
19
  const spanElem = document.createElement('span');
20
20
  spanElem.className = WIDGET_DECO_CLASS_NAME;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/additional/GPT/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAC,sBAAsB,EAAE,qBAAqB,EAAC,uBAAoB;AAE1E,OAAO,EAAC,iBAAiB,EAAC,+BAA4B;AACtD,OAAO,EAAC,iBAAiB,EAAC,mBAAgB;AAY1C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAgB,YAAY,CAAC,CAAC;AAEvD,OAAO,EAAC,GAAG,IAAI,SAAS,EAAC,CAAC;AAE1B,MAAM,CAAC,MAAM,eAAe,GAAG,CAI3B,MAAuD,EACjD,EAAE;IACR,OAAO,IAAI,MAAM,CAAC;QACd,GAAG;QACH,KAAK,EAAE;YACH,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK;YAC/B,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;gBACjB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAA8B,CAAC;gBAC1D,MAAM,SAAS,GAAG,MAAM,CAAC;gBAEzB,SAAS,CAAC,oBAAoB,GAAG,KAAK,CAAC;gBAEvC,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC1B,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;wBACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;wBAChD,QAAQ,CAAC,SAAS,GAAG,sBAAsB,CAAC;wBAC5C,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC;wBAE3B,SAAS,CAAC,oBAAoB,GAAG,IAAI,CAAC;wBAEtC,IAAI,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC;4BAAE,OAAO,aAAa,CAAC,KAAK,CAAC;wBAEnE,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;4BAChC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;gCACnC,CAAC,qBAAqB,CAAC,EAAE,IAAI;6BAChC,CAAC;yBACL,CAAC,CAAC;oBACP,CAAC;oBAED,IAAI,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC;wBAAE,OAAO,aAAa,CAAC,KAAK,CAAC;oBAEpE,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;wBAChC,UAAU,CAAC,MAAM,CACb,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,EAAE,EACP,EAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAC,EACjD,EAAC,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAC,CAClC;qBACJ,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC1B,SAAS,CAAC,oBAAoB,GAAG,KAAK,CAAC;oBAEvC,OAAO,aAAa,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBAED,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;SACJ;QACD,KAAK,EAAE;YACH,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC9C;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;KACtD,CAAC,CAAC;AACP,CAAC,CAAC","sourcesContent":["import {Plugin, PluginKey} from 'prosemirror-state';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {CommonAnswer} from './ErrorScreen/types';\nimport {WIDGET_DECO_CLASS_NAME, WIDGET_DECO_SPEC_FLAG} from './constants';\nimport type {GptWidgetDecoViewParams} from './gptExtension/view';\nimport {GptWidgetDecoView} from './gptExtension/view';\nimport {isEmptyGptPrompts} from './utils';\n\nexport type GptWidgetMeta =\n | {\n action: 'show';\n from: number;\n to: number;\n }\n | {\n action: 'hide';\n };\n\nconst key = new PluginKey<DecorationSet>('gpt-widget');\n\nexport {key as pluginKey};\n\nexport const gptWidgetPlugin = <\n AnswerData extends CommonAnswer = CommonAnswer,\n PromptData extends unknown = unknown,\n>(\n params: GptWidgetDecoViewParams<AnswerData, PromptData>,\n): Plugin => {\n return new Plugin({\n key,\n state: {\n init: () => DecorationSet.empty,\n apply: (tr, decos) => {\n const meta = tr.getMeta(key) as GptWidgetMeta | undefined;\n const paramsGpt = params;\n\n paramsGpt.disablePromptPresets = false;\n\n if (meta?.action === 'show') {\n if (meta.to === meta.from) {\n const spanElem = document.createElement('span');\n spanElem.className = WIDGET_DECO_CLASS_NAME;\n spanElem.textContent = ' ';\n\n paramsGpt.disablePromptPresets = true;\n\n if (isEmptyGptPrompts(paramsGpt, true)) return DecorationSet.empty;\n\n return DecorationSet.create(tr.doc, [\n Decoration.widget(meta.from, spanElem, {\n [WIDGET_DECO_SPEC_FLAG]: true,\n }),\n ]);\n }\n\n if (isEmptyGptPrompts(paramsGpt, false)) return DecorationSet.empty;\n\n return DecorationSet.create(tr.doc, [\n Decoration.inline(\n meta.from,\n meta.to,\n {nodeName: 'span', class: WIDGET_DECO_CLASS_NAME},\n {[WIDGET_DECO_SPEC_FLAG]: true},\n ),\n ]);\n }\n\n if (meta?.action === 'hide') {\n paramsGpt.disablePromptPresets = false;\n\n return DecorationSet.empty;\n }\n\n return decos.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations: (state) => key.getState(state),\n },\n view: (view) => new GptWidgetDecoView(view, params),\n });\n};\n"]}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/additional/GPT/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAC,sBAAsB,EAAE,qBAAqB,EAAC,uBAAoB;AAE1E,OAAO,EAAC,iBAAiB,EAAC,+BAA4B;AACtD,OAAO,EAAC,iBAAiB,EAAC,mBAAgB;AAY1C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAgB,YAAY,CAAC,CAAC;AAEvD,OAAO,EAAC,GAAG,IAAI,SAAS,EAAC,CAAC;AAE1B,MAAM,CAAC,MAAM,eAAe,GAAG,CAI3B,MAAuD,EACjD,EAAE;IACR,OAAO,IAAI,MAAM,CAAC;QACd,GAAG;QACH,KAAK,EAAE;YACH,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK;YAC/B,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;gBACjB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAA8B,CAAC;gBAC1D,MAAM,SAAS,GAAG,MAAM,CAAC;gBAEzB,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC1B,SAAS,CAAC,oBAAoB,GAAG,KAAK,CAAC;oBAEvC,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;wBACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;wBAChD,QAAQ,CAAC,SAAS,GAAG,sBAAsB,CAAC;wBAC5C,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC;wBAE3B,SAAS,CAAC,oBAAoB,GAAG,IAAI,CAAC;wBAEtC,IAAI,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC;4BAAE,OAAO,aAAa,CAAC,KAAK,CAAC;wBAEnE,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;4BAChC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;gCACnC,CAAC,qBAAqB,CAAC,EAAE,IAAI;6BAChC,CAAC;yBACL,CAAC,CAAC;oBACP,CAAC;oBAED,IAAI,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC;wBAAE,OAAO,aAAa,CAAC,KAAK,CAAC;oBAEpE,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;wBAChC,UAAU,CAAC,MAAM,CACb,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,EAAE,EACP,EAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAC,EACjD,EAAC,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAC,CAClC;qBACJ,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC1B,SAAS,CAAC,oBAAoB,GAAG,KAAK,CAAC;oBAEvC,OAAO,aAAa,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBAED,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;SACJ;QACD,KAAK,EAAE;YACH,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC9C;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;KACtD,CAAC,CAAC;AACP,CAAC,CAAC","sourcesContent":["import {Plugin, PluginKey} from 'prosemirror-state';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {CommonAnswer} from './ErrorScreen/types';\nimport {WIDGET_DECO_CLASS_NAME, WIDGET_DECO_SPEC_FLAG} from './constants';\nimport type {GptWidgetDecoViewParams} from './gptExtension/view';\nimport {GptWidgetDecoView} from './gptExtension/view';\nimport {isEmptyGptPrompts} from './utils';\n\nexport type GptWidgetMeta =\n | {\n action: 'show';\n from: number;\n to: number;\n }\n | {\n action: 'hide';\n };\n\nconst key = new PluginKey<DecorationSet>('gpt-widget');\n\nexport {key as pluginKey};\n\nexport const gptWidgetPlugin = <\n AnswerData extends CommonAnswer = CommonAnswer,\n PromptData extends unknown = unknown,\n>(\n params: GptWidgetDecoViewParams<AnswerData, PromptData>,\n): Plugin => {\n return new Plugin({\n key,\n state: {\n init: () => DecorationSet.empty,\n apply: (tr, decos) => {\n const meta = tr.getMeta(key) as GptWidgetMeta | undefined;\n const paramsGpt = params;\n\n if (meta?.action === 'show') {\n paramsGpt.disablePromptPresets = false;\n\n if (meta.to === meta.from) {\n const spanElem = document.createElement('span');\n spanElem.className = WIDGET_DECO_CLASS_NAME;\n spanElem.textContent = ' ';\n\n paramsGpt.disablePromptPresets = true;\n\n if (isEmptyGptPrompts(paramsGpt, true)) return DecorationSet.empty;\n\n return DecorationSet.create(tr.doc, [\n Decoration.widget(meta.from, spanElem, {\n [WIDGET_DECO_SPEC_FLAG]: true,\n }),\n ]);\n }\n\n if (isEmptyGptPrompts(paramsGpt, false)) return DecorationSet.empty;\n\n return DecorationSet.create(tr.doc, [\n Decoration.inline(\n meta.from,\n meta.to,\n {nodeName: 'span', class: WIDGET_DECO_CLASS_NAME},\n {[WIDGET_DECO_SPEC_FLAG]: true},\n ),\n ]);\n }\n\n if (meta?.action === 'hide') {\n paramsGpt.disablePromptPresets = false;\n\n return DecorationSet.empty;\n }\n\n return decos.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations: (state) => key.getState(state),\n },\n view: (view) => new GptWidgetDecoView(view, params),\n });\n};\n"]}
@@ -19,7 +19,7 @@ function calcListHeight(itemsCount) {
19
19
  export const CommandMenuComponent = ({ anchorElement, currentIndex, items, onItemClick, onOpenChange, }) => {
20
20
  if (!anchorElement)
21
21
  return null;
22
- return (_jsx(Popup, { open: true, anchorElement: anchorElement, placement: placement, onOpenChange: onOpenChange, qa: "g-md-command-menu", children: _jsx("div", { className: b(), children: _jsx(List, { virtualized: true, items: items, sortable: false, filterable: false, emptyPlaceholder: i18n('empty-msg'), itemHeight: ITEM_HEIGHT, itemsHeight: calcListHeight(items.length), renderItem: renderItem, deactivateOnLeave: false, activeItemIndex: currentIndex, onItemClick: (_item, index) => onItemClick(index), className: b('list'), itemClassName: b('list-item') }) }) }));
22
+ return (_jsx(Popup, { open: true, anchorElement: anchorElement, placement: placement, onOpenChange: onOpenChange, qa: "g-md-toolbar-command-menu", children: _jsx("div", { className: b(), children: _jsx(List, { virtualized: true, items: items, sortable: false, filterable: false, emptyPlaceholder: i18n('empty-msg'), itemHeight: ITEM_HEIGHT, itemsHeight: calcListHeight(items.length), renderItem: renderItem, deactivateOnLeave: false, activeItemIndex: currentIndex, onItemClick: (_item, index) => onItemClick(index), className: b('list'), itemClassName: b('list-item') }) }) }));
23
23
  };
24
24
  function renderItem({ id, title, icon, hotkey, hint, preview }) {
25
25
  const titleText = isFunction(title) ? title() : title;
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/component.tsx"],"names":[],"mappings":"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","sourcesContent":["import {HelpMark, Hotkey, Icon, List, Popup, type PopupPlacement} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../classname';\nimport {i18n} from '../../../i18n/suggest';\nimport {isFunction} from '../../../lodash';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {PreviewTooltip} from '../../../toolbar/PreviewTooltip';\nimport type {AutocompletePopupProps} from '../../../utils/autocomplete-popup';\n\nimport type {CommandAction} from './types';\n\nimport './component.scss';\n\nconst b = cn('command-menu');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nconst ITEM_HEIGHT = 28; // px\nconst VISIBLE_ITEMS_COUNT = 10;\nconst MAX_LIST_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS_COUNT; // px\nfunction calcListHeight(itemsCount: number): number | undefined {\n if (itemsCount <= 0) return undefined;\n return Math.min(MAX_LIST_HEIGHT, itemsCount * ITEM_HEIGHT);\n}\n\nexport type CommandMenuItem = Pick<\n CommandAction,\n 'id' | 'title' | 'icon' | 'hotkey' | 'hint' | 'preview'\n>;\n\nexport type CommandMenuComponentProps = AutocompletePopupProps & {\n currentIndex?: number;\n items: readonly CommandMenuItem[];\n onItemClick(itemIndex: number): void;\n};\n\nexport const CommandMenuComponent: React.FC<CommandMenuComponentProps> = ({\n anchorElement,\n currentIndex,\n items,\n onItemClick,\n onOpenChange,\n}) => {\n if (!anchorElement) return null;\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n placement={placement}\n onOpenChange={onOpenChange}\n qa=\"g-md-command-menu\"\n >\n <div className={b()}>\n <List<CommandMenuItem>\n virtualized\n items={items as CommandMenuItem[]}\n sortable={false}\n filterable={false}\n emptyPlaceholder={i18n('empty-msg')}\n itemHeight={ITEM_HEIGHT}\n itemsHeight={calcListHeight(items.length)}\n renderItem={renderItem}\n deactivateOnLeave={false}\n activeItemIndex={currentIndex}\n onItemClick={(_item, index) => onItemClick(index)}\n className={b('list')}\n itemClassName={b('list-item')}\n />\n </div>\n </Popup>\n );\n};\n\nfunction renderItem({id, title, icon, hotkey, hint, preview}: CommandMenuItem): React.ReactNode {\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n return (\n <PreviewTooltip preview={preview}>\n <div key={id} className={b('item', {id})}>\n <Icon data={icon.data} size={20} className={b('item-icon')} />\n <div className={b('item-body')}>\n <span className={b('item-title')}>{titleText}</span>\n <div className={b('item-extra')}>\n {hotkey && <Hotkey value={hotkey} className={b('item-hotkey')} />}\n {hintText && <HelpMark className={b('item-hint')}>{hintText}</HelpMark>}\n </div>\n </div>\n </div>\n </PreviewTooltip>\n );\n}\n\nexport function render(props: CommandMenuComponentProps): React.ReactNode {\n return (\n <ErrorLoggerBoundary>\n <CommandMenuComponent {...props} />\n </ErrorLoggerBoundary>\n );\n}\n"]}
1
+ {"version":3,"file":"component.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/component.tsx"],"names":[],"mappings":"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","sourcesContent":["import {HelpMark, Hotkey, Icon, List, Popup, type PopupPlacement} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../classname';\nimport {i18n} from '../../../i18n/suggest';\nimport {isFunction} from '../../../lodash';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {PreviewTooltip} from '../../../toolbar/PreviewTooltip';\nimport type {AutocompletePopupProps} from '../../../utils/autocomplete-popup';\n\nimport type {CommandAction} from './types';\n\nimport './component.scss';\n\nconst b = cn('command-menu');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nconst ITEM_HEIGHT = 28; // px\nconst VISIBLE_ITEMS_COUNT = 10;\nconst MAX_LIST_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS_COUNT; // px\nfunction calcListHeight(itemsCount: number): number | undefined {\n if (itemsCount <= 0) return undefined;\n return Math.min(MAX_LIST_HEIGHT, itemsCount * ITEM_HEIGHT);\n}\n\nexport type CommandMenuItem = Pick<\n CommandAction,\n 'id' | 'title' | 'icon' | 'hotkey' | 'hint' | 'preview'\n>;\n\nexport type CommandMenuComponentProps = AutocompletePopupProps & {\n currentIndex?: number;\n items: readonly CommandMenuItem[];\n onItemClick(itemIndex: number): void;\n};\n\nexport const CommandMenuComponent: React.FC<CommandMenuComponentProps> = ({\n anchorElement,\n currentIndex,\n items,\n onItemClick,\n onOpenChange,\n}) => {\n if (!anchorElement) return null;\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n placement={placement}\n onOpenChange={onOpenChange}\n qa=\"g-md-toolbar-command-menu\"\n >\n <div className={b()}>\n <List<CommandMenuItem>\n virtualized\n items={items as CommandMenuItem[]}\n sortable={false}\n filterable={false}\n emptyPlaceholder={i18n('empty-msg')}\n itemHeight={ITEM_HEIGHT}\n itemsHeight={calcListHeight(items.length)}\n renderItem={renderItem}\n deactivateOnLeave={false}\n activeItemIndex={currentIndex}\n onItemClick={(_item, index) => onItemClick(index)}\n className={b('list')}\n itemClassName={b('list-item')}\n />\n </div>\n </Popup>\n );\n};\n\nfunction renderItem({id, title, icon, hotkey, hint, preview}: CommandMenuItem): React.ReactNode {\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n return (\n <PreviewTooltip preview={preview}>\n <div key={id} className={b('item', {id})}>\n <Icon data={icon.data} size={20} className={b('item-icon')} />\n <div className={b('item-body')}>\n <span className={b('item-title')}>{titleText}</span>\n <div className={b('item-extra')}>\n {hotkey && <Hotkey value={hotkey} className={b('item-hotkey')} />}\n {hintText && <HelpMark className={b('item-hint')}>{hintText}</HelpMark>}\n </div>\n </div>\n </div>\n </PreviewTooltip>\n );\n}\n\nexport function render(props: CommandMenuComponentProps): React.ReactNode {\n return (\n <ErrorLoggerBoundary>\n <CommandMenuComponent {...props} />\n </ErrorLoggerBoundary>\n );\n}\n"]}
@@ -54,6 +54,7 @@ export class TooltipView {
54
54
  getSelectionTooltipProps() {
55
55
  return {
56
56
  ...this.baseProps,
57
+ qa: 'g-md-toolbar-selection',
57
58
  focus: () => this.view.focus(),
58
59
  data: this.getFilteredConfig(),
59
60
  editor: this.actions,
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,KAAK,EAAuC,MAAM,mBAAmB,CAAC;AAK9E,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAC3C,OAAO,EAAe,YAAY,EAAC,2BAAwB;AAC3D,OAAO,EAAC,mBAAmB,EAAC,8CAA2C;AACvE,OAAO,EAAC,OAAO,EAAC,kCAAyB;AAOzC,OAAO,EAAoB,yBAAyB,EAAC,kCAAyB;AAQ9E,MAAM,gBAAgB,GAAoC,CAAC,EACvD,IAAI,EACJ,WAAW,EACX,GAAG,YAAY,EAClB,EAAE,EAAE;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CACH,KAAC,KAAK,IAAC,IAAI,WAAK,WAAW,EAAE,KAAK,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC,YACpD,KAAC,OAAO,OAAK,YAAY,GAAI,GACzB,CACX,CAAC;AACN,CAAC,CAAC;AAoBF,MAAM,OAAO,WAAW;IACpB,cAAc,GAAG,KAAK,CAAC;IAEN,MAAM,CAAkB;IACxB,OAAO,CAAgB;IACvB,UAAU,CAAgB;IAC1B,SAAS,CAAiB;IAEnC,IAAI,CAAc;IAClB,SAAS,GAA8B,EAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAC,CAAC;IACtE,kBAAkB,GAAwB,IAAI,CAAC;IAEvD,YACI,OAAsB,EACtB,UAAyB,EACzB,MAAuB,EACvB,MAAyB;QAEzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,MAAM,EAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,EAAC,GAAG,MAAM,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,IAAgB,EAAE,UAAuB;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG;YACb,IAAI,EAAE,IAAI;YACV,WAAW,EAAE;gBACT,GAAG,UAAU;gBACb,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;aAC7B;SACJ,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,EAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAC,CAAC;QAChD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnC,CAAC;IAEO,wBAAwB;QAC5B,OAAO;YACH,GAAG,IAAI,CAAC,SAAS;YACjB,EAAE,EAAE,wBAAwB;YAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAC9B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC9B,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;gBACZ,YAAY,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC;YAC7D,CAAC;SACJ,CAAC;IACN,CAAC;IAEO,iBAAiB;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI;YACtB,CAAC,CAAC,IAAI,CAAC,UAAU;iBACV,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACf,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtB,MAAM,EAAC,SAAS,EAAC,GAAG,IAAI,CAAC;gBACzB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACxB,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CACL;iBACA,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvD,CAAC,CAAC,EAAE,CAAC;IACb,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,IAAY,iBAAiB;QACzB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAC1E,KAAC,mBAAmB,cAChB,KAAC,gBAAgB,OAAK,IAAI,CAAC,wBAAwB,EAAE,GAAI,GACvC,CACzB,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAEO,YAAY,CAAC,IAAgB;QACjC,MAAM,WAAW,GAAmB;YAChC,qBAAqB;gBACjB,kCAAkC;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACtD,kEAAkE;gBAClE,+CAA+C;gBAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;gBAEtE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;gBACtB,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;gBACzB,MAAM,KAAK,GAAG,CAAC,CAAC;gBAChB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;gBAEtC,OAAO;oBACH,GAAG;oBACH,IAAI;oBACJ,KAAK,EAAE,IAAI,GAAG,KAAK;oBACnB,MAAM,EAAE,GAAG,GAAG,MAAM;oBACpB,CAAC,EAAE,GAAG;oBACN,CAAC,EAAE,IAAI;oBACP,MAAM;oBACN,KAAK;iBACR,CAAC;YACN,CAAC;SACJ,CAAC;QAEF,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,WAAW;SAC7B,CAAC;IACN,CAAC;CACJ","sourcesContent":["import type {VirtualElement} from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n qa: 'g-md-toolbar-selection',\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
@@ -19,6 +19,6 @@ export const ImgSettingsButton = function ({ node, view, updateAttributes, visib
19
19
  const isVisibleImageForm = edit;
20
20
  const isVisibleEditButton = !edit && (visible || popupOpen);
21
21
  const isVisiblePopup = !edit && popupOpen;
22
- return (_jsxs(_Fragment, { children: [isVisibleImageForm && (_jsx(ImageForm, { node: node, view: view, updateAttributes: updateAttributes, anchorElement: nodeElement, unsetEdit: unsetEdit })), isVisibleEditButton && (_jsx(Button, { onClick: togglePopup, ref: setAnchorElement, size: "s", view: 'raised', className: b(null, ReactNodeStopEventCn), children: _jsx(Icon, { data: Ellipsis, className: ReactNodeStopEventCn }) })), _jsx(Popup, { open: isVisiblePopup, anchorElement: anchorElement, onOpenChange: unsetPopupOpen, placement: placement, children: _jsxs(Menu, { children: [_jsx(Menu.Item, { onClick: handleEdit, children: i18nCommon('edit') }), _jsx(Menu.Item, { onClick: onDelete, children: i18nCommon('delete') })] }) })] }));
22
+ return (_jsxs(_Fragment, { children: [isVisibleImageForm && (_jsx(ImageForm, { node: node, view: view, updateAttributes: updateAttributes, anchorElement: nodeElement, unsetEdit: unsetEdit })), isVisibleEditButton && (_jsx(Button, { qa: "g-md-image-settings-button", onClick: togglePopup, ref: setAnchorElement, size: "s", view: 'raised', className: b(null, ReactNodeStopEventCn), children: _jsx(Icon, { data: Ellipsis, className: ReactNodeStopEventCn }) })), _jsx(Popup, { open: isVisiblePopup, anchorElement: anchorElement, onOpenChange: unsetPopupOpen, placement: placement, children: _jsxs(Menu, { qa: "g-md-image-settings-menu", children: [_jsx(Menu.Item, { extraProps: { 'aria-label': i18nCommon('edit') }, onClick: handleEdit, children: i18nCommon('edit') }), _jsx(Menu.Item, { extraProps: { 'aria-label': i18nCommon('delete') }, onClick: onDelete, children: i18nCommon('delete') })] }) })] }));
23
23
  };
24
24
  //# sourceMappingURL=ImgSettingsButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImgSettingsButton.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AAIjF,OAAO,EAAC,EAAE,EAAC,oCAAiC;AAC5C,OAAO,EAAC,IAAI,IAAI,UAAU,EAAC,4CAAmC;AAC9D,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,4CAAyC;AAClF,OAAO,EAAC,oBAAoB,EAAC,sDAAmD;AAEhF,OAAO,EAAC,SAAS,EAAC,6BAAoB;AAEtC,iCAAkC;AAElC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAWzB,UAAU,EACX,IAAI,EACJ,IAAI,EACJ,gBAAgB,EAChB,OAAO,EACP,IAAI,EACJ,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,GACX;IACG,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5D,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,SAAS,GAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAChC,MAAM,mBAAmB,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;IAE1C,OAAO,CACH,8BACK,kBAAkB,IAAI,CACnB,KAAC,SAAS,IACN,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,WAAW,EAC1B,SAAS,EAAE,SAAS,GACtB,CACL,EAEA,mBAAmB,IAAI,CACpB,KAAC,MAAM,IACH,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAC,GAAG,EACR,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,CAAC,YAExC,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,oBAAoB,GAAI,GACpD,CACZ,EAED,KAAC,KAAK,IACF,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,cAAc,EAC5B,SAAS,EAAE,SAAS,YAEpB,MAAC,IAAI,eACD,KAAC,IAAI,CAAC,IAAI,IAAC,OAAO,EAAE,UAAU,YAAG,UAAU,CAAC,MAAM,CAAC,GAAa,EAChE,KAAC,IAAI,CAAC,IAAI,IAAC,OAAO,EAAE,QAAQ,YAAG,UAAU,CAAC,QAAQ,CAAC,GAAa,IAC7D,GACH,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {Ellipsis} from '@gravity-ui/icons';\nimport {Button, Icon, Menu, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../../../../classname';\nimport {i18n as i18nCommon} from '../../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../../react-utils/hooks';\nimport {ReactNodeStopEventCn} from '../../../../../react-utils/react-node-view';\n\nimport {ImageForm} from './ImageForm';\n\nimport './ImgSettingsButton.scss';\n\nconst b = cn('img-settings-button');\n\nexport const ImgSettingsButton: React.FC<{\n node: Node;\n view: EditorView;\n getPos: () => number | undefined;\n updateAttributes: (o: object) => void;\n nodeElement: HTMLElement | null;\n visible: boolean;\n toggleEdit: () => void;\n edit: boolean;\n unsetEdit: () => void;\n onDelete: () => void;\n}> = function ({\n node,\n view,\n updateAttributes,\n visible,\n edit,\n toggleEdit,\n nodeElement,\n unsetEdit,\n onDelete,\n}) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [popupOpen, _setPopupOpen, unsetPopupOpen, togglePopup] = useBooleanState(false);\n const placement: PopupPlacement = ['bottom-end', 'bottom-start'];\n\n const handleEdit = () => {\n toggleEdit();\n unsetPopupOpen();\n };\n\n const isVisibleImageForm = edit;\n const isVisibleEditButton = !edit && (visible || popupOpen);\n const isVisiblePopup = !edit && popupOpen;\n\n return (\n <>\n {isVisibleImageForm && (\n <ImageForm\n node={node}\n view={view}\n updateAttributes={updateAttributes}\n anchorElement={nodeElement}\n unsetEdit={unsetEdit}\n />\n )}\n\n {isVisibleEditButton && (\n <Button\n onClick={togglePopup}\n ref={setAnchorElement}\n size=\"s\"\n view={'raised'}\n className={b(null, ReactNodeStopEventCn)}\n >\n <Icon data={Ellipsis} className={ReactNodeStopEventCn} />\n </Button>\n )}\n\n <Popup\n open={isVisiblePopup}\n anchorElement={anchorElement}\n onOpenChange={unsetPopupOpen}\n placement={placement}\n >\n <Menu>\n <Menu.Item onClick={handleEdit}>{i18nCommon('edit')}</Menu.Item>\n <Menu.Item onClick={onDelete}>{i18nCommon('delete')}</Menu.Item>\n </Menu>\n </Popup>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"ImgSettingsButton.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AAIjF,OAAO,EAAC,EAAE,EAAC,oCAAiC;AAC5C,OAAO,EAAC,IAAI,IAAI,UAAU,EAAC,4CAAmC;AAC9D,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,4CAAyC;AAClF,OAAO,EAAC,oBAAoB,EAAC,sDAAmD;AAEhF,OAAO,EAAC,SAAS,EAAC,6BAAoB;AAEtC,iCAAkC;AAElC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAWzB,UAAU,EACX,IAAI,EACJ,IAAI,EACJ,gBAAgB,EAChB,OAAO,EACP,IAAI,EACJ,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,GACX;IACG,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5D,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,SAAS,GAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAChC,MAAM,mBAAmB,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;IAE1C,OAAO,CACH,8BACK,kBAAkB,IAAI,CACnB,KAAC,SAAS,IACN,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,WAAW,EAC1B,SAAS,EAAE,SAAS,GACtB,CACL,EAEA,mBAAmB,IAAI,CACpB,KAAC,MAAM,IACH,EAAE,EAAC,4BAA4B,EAC/B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAC,GAAG,EACR,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,CAAC,YAExC,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,oBAAoB,GAAI,GACpD,CACZ,EAED,KAAC,KAAK,IACF,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,cAAc,EAC5B,SAAS,EAAE,SAAS,YAEpB,MAAC,IAAI,IAAC,EAAE,EAAC,0BAA0B,aAC/B,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAE,EAAC,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,EAAC,EAAE,OAAO,EAAE,UAAU,YACzE,UAAU,CAAC,MAAM,CAAC,GACX,EACZ,KAAC,IAAI,CAAC,IAAI,IAAC,UAAU,EAAE,EAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAC,EAAE,OAAO,EAAE,QAAQ,YACzE,UAAU,CAAC,QAAQ,CAAC,GACb,IACT,GACH,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {Ellipsis} from '@gravity-ui/icons';\nimport {Button, Icon, Menu, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../../../../classname';\nimport {i18n as i18nCommon} from '../../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../../react-utils/hooks';\nimport {ReactNodeStopEventCn} from '../../../../../react-utils/react-node-view';\n\nimport {ImageForm} from './ImageForm';\n\nimport './ImgSettingsButton.scss';\n\nconst b = cn('img-settings-button');\n\nexport const ImgSettingsButton: React.FC<{\n node: Node;\n view: EditorView;\n getPos: () => number | undefined;\n updateAttributes: (o: object) => void;\n nodeElement: HTMLElement | null;\n visible: boolean;\n toggleEdit: () => void;\n edit: boolean;\n unsetEdit: () => void;\n onDelete: () => void;\n}> = function ({\n node,\n view,\n updateAttributes,\n visible,\n edit,\n toggleEdit,\n nodeElement,\n unsetEdit,\n onDelete,\n}) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [popupOpen, _setPopupOpen, unsetPopupOpen, togglePopup] = useBooleanState(false);\n const placement: PopupPlacement = ['bottom-end', 'bottom-start'];\n\n const handleEdit = () => {\n toggleEdit();\n unsetPopupOpen();\n };\n\n const isVisibleImageForm = edit;\n const isVisibleEditButton = !edit && (visible || popupOpen);\n const isVisiblePopup = !edit && popupOpen;\n\n return (\n <>\n {isVisibleImageForm && (\n <ImageForm\n node={node}\n view={view}\n updateAttributes={updateAttributes}\n anchorElement={nodeElement}\n unsetEdit={unsetEdit}\n />\n )}\n\n {isVisibleEditButton && (\n <Button\n qa=\"g-md-image-settings-button\"\n onClick={togglePopup}\n ref={setAnchorElement}\n size=\"s\"\n view={'raised'}\n className={b(null, ReactNodeStopEventCn)}\n >\n <Icon data={Ellipsis} className={ReactNodeStopEventCn} />\n </Button>\n )}\n\n <Popup\n open={isVisiblePopup}\n anchorElement={anchorElement}\n onOpenChange={unsetPopupOpen}\n placement={placement}\n >\n <Menu qa=\"g-md-image-settings-menu\">\n <Menu.Item extraProps={{'aria-label': i18nCommon('edit')}} onClick={handleEdit}>\n {i18nCommon('edit')}\n </Menu.Item>\n <Menu.Item extraProps={{'aria-label': i18nCommon('delete')}} onClick={onDelete}>\n {i18nCommon('delete')}\n </Menu.Item>\n </Menu>\n </Popup>\n </>\n );\n};\n"]}
@@ -76,6 +76,6 @@ export const ImageNodeView = ({ node, view, getPos, updateAttributes, }) => {
76
76
  setRef(imageRef, elem);
77
77
  setImageElement(elem);
78
78
  }, [setImageElement]);
79
- return (_jsx("div", { ref: imageContainerRef, children: _jsxs(Resizable, { hover: isNodeHovered, resizing: state.resizing, onResizeLeft: createHandleResize('left'), onResizeRight: createHandleResize('right'), children: [_jsx(ImgSettingsButton, { node: node, view: view, getPos: getPos, updateAttributes: updateAttributes, visible: isNodeHovered && !edit && !state.resizing, edit: edit, toggleEdit: toggleEdit, nodeElement: imageElement, onDelete: handleDelete, unsetEdit: unsetEdit }), _jsx("img", { ref: refFn, src: src, alt: alt, style: style })] }) }));
79
+ return (_jsx("div", { ref: imageContainerRef, "data-qa": "g-md-image", children: _jsxs(Resizable, { hover: isNodeHovered, resizing: state.resizing, onResizeLeft: createHandleResize('left'), onResizeRight: createHandleResize('right'), children: [_jsx(ImgSettingsButton, { node: node, view: view, getPos: getPos, updateAttributes: updateAttributes, visible: isNodeHovered && !edit && !state.resizing, edit: edit, toggleEdit: toggleEdit, nodeElement: imageElement, onDelete: handleDelete, unsetEdit: unsetEdit }), _jsx("img", { ref: refFn, src: src, alt: alt, style: style })] }) }));
80
80
  };
81
81
  //# sourceMappingURL=NodeView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useRef} from 'react';\n\nimport {setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../../classname';\nimport {\n type ReactNodeViewProps,\n useElementState,\n useNodeEditing,\n useNodeHovered,\n} from '../../../../../react-utils';\nimport {type ResizeDirection, useNodeResizing} from '../../../../../react-utils/useNodeResizing';\nimport {removeNode} from '../../../../../utils';\nimport {Resizable} from '../../../../behavior/Resizable/Resizable';\nimport {ImgSizeAttr} from '../../ImgSizeSpecs';\nimport {imageRendererKey} from '../../const';\n\nimport {ImgSettingsButton} from './ImgSettingsButton';\n\nimport './ImgNodeView.scss';\n\nexport const cnImgSizeNodeView = cn('img-size-node-view');\n\nexport const ImageNodeView: React.FC<ReactNodeViewProps> = ({\n node,\n view,\n getPos,\n updateAttributes,\n}) => {\n const imageContainerRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageElement, setImageElement] = useElementState();\n\n const alt = node.attrs[ImgSizeAttr.Alt] || '';\n const initialHeight = node.attrs[ImgSizeAttr.Height];\n const initialWidth = node.attrs[ImgSizeAttr.Width];\n const src = node.attrs[ImgSizeAttr.Src] || '';\n const title = node.attrs[ImgSizeAttr.Title] || '';\n\n const isNodeHovered = useNodeHovered(imageContainerRef);\n const [edit, setEditing, unsetEdit, toggleEdit] = useNodeEditing({\n nodeRef: imageContainerRef,\n view,\n });\n\n const handleResize = useCallback(\n ({width, height}: {width?: number; height?: number}) => {\n updateAttributes({\n width: width === undefined ? undefined : String(Math.round(width)),\n height: height === undefined ? undefined : String(Math.round(height)),\n name: title,\n alt,\n });\n },\n [alt, title, updateAttributes],\n );\n\n const {state, startResizing} = useNodeResizing({\n width: initialWidth,\n height: initialHeight,\n ref: imageRef,\n onResize: handleResize,\n });\n\n const style: React.HTMLAttributes<HTMLImageElement>['style'] = {\n transition: 'width 0.15s ease-out, height 0.15s ease-out',\n };\n\n if (state.width) {\n style.width = `${state.width}px`;\n\n if (state.height) {\n style.aspectRatio = state.width / state.height;\n style.height = 'auto;';\n }\n } else if (state.height) {\n style.height = `${state.height}px`;\n }\n\n const handleDelete = useCallback(() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n view.focus();\n }, [getPos, node, view]);\n\n const createHandleResize =\n (direction: ResizeDirection) => (event: React.MouseEvent<HTMLElement>) => {\n startResizing(event, direction);\n };\n\n useEffect(() => {\n if (imageRendererKey.getState(view.state)?.linkAdded) {\n setEditing();\n }\n }, [view, setEditing]);\n\n const refFn = useCallback(\n (elem: HTMLImageElement | null) => {\n setRef(imageRef, elem);\n setImageElement(elem);\n },\n [setImageElement],\n );\n\n return (\n <div ref={imageContainerRef}>\n <Resizable\n hover={isNodeHovered}\n resizing={state.resizing}\n onResizeLeft={createHandleResize('left')}\n onResizeRight={createHandleResize('right')}\n >\n <ImgSettingsButton\n node={node}\n view={view}\n getPos={getPos}\n updateAttributes={updateAttributes}\n visible={isNodeHovered && !edit && !state.resizing}\n edit={edit}\n toggleEdit={toggleEdit}\n nodeElement={imageElement}\n onDelete={handleDelete}\n unsetEdit={unsetEdit}\n />\n <img ref={refFn} src={src} alt={alt} style={style} />\n </Resizable>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useRef} from 'react';\n\nimport {setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../../classname';\nimport {\n type ReactNodeViewProps,\n useElementState,\n useNodeEditing,\n useNodeHovered,\n} from '../../../../../react-utils';\nimport {type ResizeDirection, useNodeResizing} from '../../../../../react-utils/useNodeResizing';\nimport {removeNode} from '../../../../../utils';\nimport {Resizable} from '../../../../behavior/Resizable/Resizable';\nimport {ImgSizeAttr} from '../../ImgSizeSpecs';\nimport {imageRendererKey} from '../../const';\n\nimport {ImgSettingsButton} from './ImgSettingsButton';\n\nimport './ImgNodeView.scss';\n\nexport const cnImgSizeNodeView = cn('img-size-node-view');\n\nexport const ImageNodeView: React.FC<ReactNodeViewProps> = ({\n node,\n view,\n getPos,\n updateAttributes,\n}) => {\n const imageContainerRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageElement, setImageElement] = useElementState();\n\n const alt = node.attrs[ImgSizeAttr.Alt] || '';\n const initialHeight = node.attrs[ImgSizeAttr.Height];\n const initialWidth = node.attrs[ImgSizeAttr.Width];\n const src = node.attrs[ImgSizeAttr.Src] || '';\n const title = node.attrs[ImgSizeAttr.Title] || '';\n\n const isNodeHovered = useNodeHovered(imageContainerRef);\n const [edit, setEditing, unsetEdit, toggleEdit] = useNodeEditing({\n nodeRef: imageContainerRef,\n view,\n });\n\n const handleResize = useCallback(\n ({width, height}: {width?: number; height?: number}) => {\n updateAttributes({\n width: width === undefined ? undefined : String(Math.round(width)),\n height: height === undefined ? undefined : String(Math.round(height)),\n name: title,\n alt,\n });\n },\n [alt, title, updateAttributes],\n );\n\n const {state, startResizing} = useNodeResizing({\n width: initialWidth,\n height: initialHeight,\n ref: imageRef,\n onResize: handleResize,\n });\n\n const style: React.HTMLAttributes<HTMLImageElement>['style'] = {\n transition: 'width 0.15s ease-out, height 0.15s ease-out',\n };\n\n if (state.width) {\n style.width = `${state.width}px`;\n\n if (state.height) {\n style.aspectRatio = state.width / state.height;\n style.height = 'auto;';\n }\n } else if (state.height) {\n style.height = `${state.height}px`;\n }\n\n const handleDelete = useCallback(() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n view.focus();\n }, [getPos, node, view]);\n\n const createHandleResize =\n (direction: ResizeDirection) => (event: React.MouseEvent<HTMLElement>) => {\n startResizing(event, direction);\n };\n\n useEffect(() => {\n if (imageRendererKey.getState(view.state)?.linkAdded) {\n setEditing();\n }\n }, [view, setEditing]);\n\n const refFn = useCallback(\n (elem: HTMLImageElement | null) => {\n setRef(imageRef, elem);\n setImageElement(elem);\n },\n [setImageElement],\n );\n\n return (\n <div ref={imageContainerRef} data-qa=\"g-md-image\">\n <Resizable\n hover={isNodeHovered}\n resizing={state.resizing}\n onResizeLeft={createHandleResize('left')}\n onResizeRight={createHandleResize('right')}\n >\n <ImgSettingsButton\n node={node}\n view={view}\n getPos={getPos}\n updateAttributes={updateAttributes}\n visible={isNodeHovered && !edit && !state.resizing}\n edit={edit}\n toggleEdit={toggleEdit}\n nodeElement={imageElement}\n onDelete={handleDelete}\n unsetEdit={unsetEdit}\n />\n <img ref={refFn} src={src} alt={alt} style={style} />\n </Resizable>\n </div>\n );\n};\n"]}
@@ -32,7 +32,7 @@ export const yfmNoteTooltipPlugin = ({ actions, schema }) => new Plugin({
32
32
  content: (view, { node, pos }) => (_jsx(Toolbar, { editor: actions, focus: () => view.focus(),
33
33
  // the yfm class allows to access css variables
34
34
  // https://github.com/diplodoc-platform/transform/blob/master/src/scss/_common.scss#L17
35
- className: "yfm g-md-yfm-note-toolbar", data: [
35
+ className: "yfm g-md-yfm-note-toolbar", qa: "g-md-toolbar-yfm-note", data: [
36
36
  [
37
37
  YfmNoteType.info,
38
38
  YfmNoteType.tip,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {CircleInfo, TrashBin} from '@gravity-ui/icons';\nimport type {Node, Schema} from 'prosemirror-model';\nimport {Plugin, type Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../../core';\nimport {i18n} from '../../../../../i18n/yfm-note';\nimport {BaseTooltipPluginView} from '../../../../../plugins/BaseTooltip';\nimport {Toolbar, ToolbarDataType} from '../../../../../toolbar';\nimport {removeNode} from '../../../../../utils/remove-node';\nimport {noteType} from '../../../index';\n\nimport './index.scss';\n\nenum YfmNoteType {\n tip = 'tip',\n info = 'info',\n warning = 'warning',\n alert = 'alert',\n}\n\nconst isEnable = () => true;\nconst isActive = () => false;\n\nconst changeType: (\n type: YfmNoteType,\n) => (params: {\n schema: Schema;\n node: Node;\n pos: number;\n dispatch: EditorView['dispatch'];\n tr: Transaction;\n}) => void =\n (type) =>\n ({node, pos, dispatch, tr}) => {\n dispatch(\n tr.setNodeMarkup(pos, null, {\n ...node.attrs,\n class: `yfm-note yfm-accent-${type}`,\n 'note-type': type,\n }),\n );\n };\n\nexport const yfmNoteTooltipPlugin = ({actions, schema}: ExtensionDeps) =>\n new Plugin({\n view(view) {\n return new BaseTooltipPluginView(view, {\n idPrefix: 'yfm-note-tooltip',\n nodeType: noteType(view.state.schema),\n popupPlacement: ['bottom', 'top'],\n content: (view, {node, pos}) => (\n <Toolbar\n editor={actions}\n focus={() => view.focus()}\n // the yfm class allows to access css variables\n // https://github.com/diplodoc-platform/transform/blob/master/src/scss/_common.scss#L17\n className=\"yfm g-md-yfm-note-toolbar\"\n data={[\n [\n YfmNoteType.info,\n YfmNoteType.tip,\n YfmNoteType.warning,\n YfmNoteType.alert,\n ].map((type) => ({\n id: `note-type-${type}`,\n icon: {data: CircleInfo},\n title: i18n(type),\n type: ToolbarDataType.SingleButton,\n isActive,\n isEnable,\n exec: () =>\n changeType(type)({\n schema,\n pos: pos,\n node: node,\n tr: view.state.tr,\n dispatch: view.dispatch.bind(view),\n }),\n })),\n [\n {\n id: 'note-remove',\n icon: {data: TrashBin},\n title: i18n('remove'),\n type: ToolbarDataType.SingleButton,\n isActive,\n isEnable,\n exec: () =>\n removeNode({\n pos: pos,\n node: node,\n tr: view.state.tr,\n dispatch: view.dispatch.bind(view),\n }),\n },\n ],\n ]}\n />\n ),\n });\n },\n });\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {CircleInfo, TrashBin} from '@gravity-ui/icons';\nimport type {Node, Schema} from 'prosemirror-model';\nimport {Plugin, type Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../../core';\nimport {i18n} from '../../../../../i18n/yfm-note';\nimport {BaseTooltipPluginView} from '../../../../../plugins/BaseTooltip';\nimport {Toolbar, ToolbarDataType} from '../../../../../toolbar';\nimport {removeNode} from '../../../../../utils/remove-node';\nimport {noteType} from '../../../index';\n\nimport './index.scss';\n\nenum YfmNoteType {\n tip = 'tip',\n info = 'info',\n warning = 'warning',\n alert = 'alert',\n}\n\nconst isEnable = () => true;\nconst isActive = () => false;\n\nconst changeType: (\n type: YfmNoteType,\n) => (params: {\n schema: Schema;\n node: Node;\n pos: number;\n dispatch: EditorView['dispatch'];\n tr: Transaction;\n}) => void =\n (type) =>\n ({node, pos, dispatch, tr}) => {\n dispatch(\n tr.setNodeMarkup(pos, null, {\n ...node.attrs,\n class: `yfm-note yfm-accent-${type}`,\n 'note-type': type,\n }),\n );\n };\n\nexport const yfmNoteTooltipPlugin = ({actions, schema}: ExtensionDeps) =>\n new Plugin({\n view(view) {\n return new BaseTooltipPluginView(view, {\n idPrefix: 'yfm-note-tooltip',\n nodeType: noteType(view.state.schema),\n popupPlacement: ['bottom', 'top'],\n content: (view, {node, pos}) => (\n <Toolbar\n editor={actions}\n focus={() => view.focus()}\n // the yfm class allows to access css variables\n // https://github.com/diplodoc-platform/transform/blob/master/src/scss/_common.scss#L17\n className=\"yfm g-md-yfm-note-toolbar\"\n qa=\"g-md-toolbar-yfm-note\"\n data={[\n [\n YfmNoteType.info,\n YfmNoteType.tip,\n YfmNoteType.warning,\n YfmNoteType.alert,\n ].map((type) => ({\n id: `note-type-${type}`,\n icon: {data: CircleInfo},\n title: i18n(type),\n type: ToolbarDataType.SingleButton,\n isActive,\n isEnable,\n exec: () =>\n changeType(type)({\n schema,\n pos: pos,\n node: node,\n tr: view.state.tr,\n dispatch: view.dispatch.bind(view),\n }),\n })),\n [\n {\n id: 'note-remove',\n icon: {data: TrashBin},\n title: i18n('remove'),\n type: ToolbarDataType.SingleButton,\n isActive,\n isEnable,\n exec: () =>\n removeNode({\n pos: pos,\n node: node,\n tr: view.state.tr,\n dispatch: view.dispatch.bind(view),\n }),\n },\n ],\n ]}\n />\n ),\n });\n },\n });\n"]}