UNPKG

@empoleon/tiptap

Version:

Rich text editor based on tiptap

1 lines 13 kB
{"version":3,"file":"RichTextEditorLinkControl.mjs","sources":["../../src/RichTextEditorControl/RichTextEditorLinkControl.tsx"],"sourcesContent":["import {\n BoxProps,\n Button,\n CompoundStylesApiProps,\n factory,\n Factory,\n Popover,\n PopoverProps,\n rem,\n TextInput,\n Tooltip,\n UnstyledButton,\n useProps,\n useResolvedStylesApi,\n} from '@empoleon/core';\nimport { useDisclosure, useInputState, useWindowEvent } from '@empoleon/hooks';\nimport { IconExternalLink, IconLink } from '../icons/Icons';\nimport { useRichTextEditorContext } from '../RichTextEditor.context';\nimport { RichTextEditorControlBase, RichTextEditorControlBaseProps } from './RichTextEditorControl';\nimport classes from '../RichTextEditor.module.css';\nimport { createSignal, splitProps } from 'solid-js';\n\nexport type RichTextEditorLinkControlStylesNames =\n | 'control'\n | 'linkEditor'\n | 'linkEditorDropdown'\n | 'linkEditorSave'\n | 'linkEditorInput'\n | 'linkEditorExternalControl';\n\nexport interface RichTextEditorLinkControlProps\n extends BoxProps,\n Omit<RichTextEditorControlBaseProps, 'classNames' | 'styles' | 'vars'>,\n CompoundStylesApiProps<RichTextEditorLinkControlFactory> {\n /** Props passed down to Popover component */\n popoverProps?: Partial<PopoverProps>;\n\n /** Determines whether external link control tooltip should be disabled, `false` by default */\n disableTooltips?: boolean;\n\n /** Initial state for determining whether the link should be an external, `false` by default */\n initialExternal?: boolean;\n}\n\nexport type RichTextEditorLinkControlFactory = Factory<{\n props: RichTextEditorLinkControlProps;\n ref: HTMLButtonElement;\n stylesNames: RichTextEditorLinkControlStylesNames;\n compound: true;\n}>;\n\nconst LinkIcon: RichTextEditorControlBaseProps['icon'] = (props) => <IconLink {...props} />;\n\nconst defaultProps: Partial<RichTextEditorLinkControlProps> = {};\n\nexport const RichTextEditorLinkControl = factory<RichTextEditorLinkControlFactory>(_props => {\n const props = useProps('RichTextEditorLinkControl', defaultProps, _props);\n const [local, others] = splitProps(props, [\n 'classNames',\n 'className',\n 'style',\n 'styles',\n 'vars',\n 'icon',\n 'popoverProps',\n 'disableTooltips',\n 'initialExternal',\n 'ref'\n ]);\n\n const ctx = useRichTextEditorContext();\n\n const stylesApiProps = { classNames: local.classNames, styles: local.styles };\n\n const [url, setUrl] = useInputState('');\n const [external, setExternal] = createSignal(local.initialExternal);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleOpen = () => {\n open();\n const linkData = ctx.editor?.getAttributes('link');\n setUrl(linkData?.href || '');\n setExternal(linkData?.href ? linkData?.target === '_blank' : local.initialExternal);\n };\n\n const handleClose = () => {\n close();\n setUrl('');\n setExternal(local.initialExternal);\n };\n\n const setLink = () => {\n handleClose();\n url() === ''\n ? ctx.editor?.chain().focus().extendMarkRange('link').unsetLink().run()\n : ctx.editor\n ?.chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: url(), target: external() ? '_blank' : null })\n .run();\n };\n\n const handleInputKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n setLink();\n }\n };\n\n useWindowEvent('edit-link', handleOpen, false);\n\n const { resolvedClassNames, resolvedStyles } =\n useResolvedStylesApi<RichTextEditorLinkControlFactory>({ classNames: local.classNames, styles: local.styles, props });\n\n return (\n <Popover\n trapFocus\n shadow=\"md\"\n withinPortal\n opened={opened()}\n onChange={(_opened) => !_opened && handleClose()}\n offset={-44}\n zIndex={10000}\n {...local.popoverProps}\n >\n <Popover.Target>\n <RichTextEditorControlBase\n icon={local.icon || LinkIcon}\n {...others}\n aria-label={ctx.labels.linkControlLabel}\n title={ctx.labels.linkControlLabel}\n onClick={handleOpen}\n active={ctx.editor?.isActive('link')}\n ref={local.ref}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n className={local.className}\n style={local.style}\n variant={ctx.variant}\n />\n </Popover.Target>\n\n <Popover.Dropdown {...ctx.getStyles('linkEditorDropdown', stylesApiProps)}>\n <div {...ctx.getStyles('linkEditor', stylesApiProps)}>\n <TextInput\n placeholder={ctx.labels.linkEditorInputPlaceholder}\n aria-label={ctx.labels.linkEditorInputLabel}\n type=\"url\"\n value={url()}\n onChange={setUrl}\n classNames={{ input: ctx.getStyles('linkEditorInput', stylesApiProps).className }}\n onKeyDown={handleInputKeydown}\n rightSection={\n <Tooltip\n label={\n external() ? ctx.labels.linkEditorExternalLink : ctx.labels.linkEditorInternalLink\n }\n events={{ hover: true, focus: true, touch: true }}\n withinPortal\n withArrow\n disabled={local.disableTooltips}\n zIndex={10000}\n >\n {(props) => (\n <UnstyledButton\n onClick={() => setExternal((e) => !e)}\n data-active={external || undefined}\n {...ctx.getStyles('linkEditorExternalControl', stylesApiProps)}\n {...props}\n >\n <IconExternalLink style={{ width: rem(14), height: rem(14) }} />\n </UnstyledButton>\n )}\n </Tooltip>\n }\n />\n\n <Button\n variant=\"default\"\n onClick={setLink}\n {...ctx.getStyles('linkEditorSave', stylesApiProps)}\n >\n {ctx.labels.linkEditorSave}\n </Button>\n </div>\n </Popover.Dropdown>\n </Popover>\n );\n});\n\nRichTextEditorLinkControl.classes = classes;\nRichTextEditorLinkControl.displayName = '@empoleon/tiptap/RichTextEditorLinkControl';\n"],"names":["LinkIcon","props","_$createComponent","IconLink","defaultProps","RichTextEditorLinkControl","factory","_props","useProps","local","others","splitProps","ctx","useRichTextEditorContext","stylesApiProps","classNames","styles","url","setUrl","useInputState","external","setExternal","createSignal","initialExternal","opened","open","close","useDisclosure","handleOpen","linkData","editor","getAttributes","href","target","handleClose","setLink","chain","focus","extendMarkRange","unsetLink","run","handleInputKeydown","event","key","preventDefault","useWindowEvent","resolvedClassNames","resolvedStyles","useResolvedStylesApi","Popover","_$mergeProps","trapFocus","shadow","withinPortal","onChange","_opened","offset","zIndex","popoverProps","children","Target","RichTextEditorControlBase","icon","aria-label","labels","linkControlLabel","title","onClick","active","isActive","ref","r$","_ref$","className","style","variant","Dropdown","getStyles","_el$","_tmpl$","_$spread","_$insert","TextInput","placeholder","linkEditorInputPlaceholder","linkEditorInputLabel","type","value","input","onKeyDown","rightSection","Tooltip","label","linkEditorExternalLink","linkEditorInternalLink","events","hover","touch","withArrow","disabled","disableTooltips","UnstyledButton","e","IconExternalLink","width","rem","height","Button","linkEditorSave","classes","displayName"],"mappings":"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"}